【发布时间】:2015-02-06 06:30:23
【问题描述】:
我正在尝试定期读取 proc 文件 /proc/stat,但我想避免每次访问时都必须打开和关闭 proc 文件。
我想在某种初始化函数中打开文件,然后在其他函数中继续使用它,然后再关闭它。
似乎函数打开的文件句柄在函数退出时被关闭 我怎样才能让它保持打开状态?
如果我应该以其他方式这样做,请告诉我
我正在尝试做的示例:
#include <stdio.h>
int printer(FILE* fin)
{
/* I am getting fin as NULL */
if(!fin)
return 1;
char buf[16*1024];
rewind(fin);
size_t sz = fread(buf, 1, sizeof(buf), fin);
if (sz) {
buf[sz]=0;
printf(buf);
}
return 0;
}
int opener(FILE *fin)
{
fin = fopen("/proc/stat", "r");
if (!fin) {
perror("fopen");
return 1;
}
return 0;
}
int main() {
FILE *fin;
/*
* I know it works if I open the file handle in here instead of
* in another function but I want to avoid this
*/
if(opener(fin))
{
printf("ERROR1\n");
return 0;
}
while(1) {
if(printer(fin))
{
printf("ERROR2\n");
break;
}
sleep(1);
}
return 0;
}
【问题讨论】:
-
文件将保持打开状态,直到您调用
fclose,但您不会... -
为什么有 C++ 标签?也就是说,您传递被复制的指针,对一个副本的更改对原始副本没有影响。研究“参考调用”。
-
只是一个旁注:你缺少一个
<unistd.h>包含sleep()。省略它是不可移植的。 -
如果你想更新
fin,你的函数需要使用指向文件句柄的指针——即使用FILE**,而不是FILE*。 -
正如@RedAlert 所说——或你可以让
opener()返回一个FILE*(或NULL出错)。