我试图定期读取proc文件/ proc / stat,但我想避免每次要访问时都打开和关闭proc文件。
我想以某种init函数打开文件,然后继续在其他函数中使用它,然后稍后关闭它。
当函数退出时,函数打开的文件句柄似乎被关闭 我怎样才能保持开放状态?
如果我应该以其他方式这样做,请告诉我
我想做的样本:
#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;
}
答案 0 :(得分:1)
c中的函数是按值传递的。因此,当您将文件句柄传递给函数时,它会接收该句柄的副本并在本地更新它。如果您希望这些更新传播到调用者,则需要传递文件句柄指针。所以你的开放看起来像:
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;
}
/...
}
答案 1 :(得分:0)
您需要将对指针的引用传递给fin,以便将其保留在main中。
if(opener(&fin)) {}
将其作为双指针传递:
int opener(FILE **fin) {}
并将其与derefencing一起使用
*fin = fopen("/proc/stat", "r");
否则每次调用子功能时都会启动它。
答案 2 :(得分:0)
C语言按值传递参数,因此fin
所拥有的opener
是fin
所拥有的main
的副本。更改fin
中的opener
对主副本没有任何影响。
一种解决方案是在opener
中使用临时文件指针,然后返回该指针。要指示错误,请返回NULL。
FILE *opener( char *name )
{
FILE *temp = fopen( name, "r" );
if ( !temp )
{
perror( "fopen" );
return( NULL );
}
return( temp );
}
int main( void )
{
FILE *fin = opener( "/proc/stat" );
if ( !fin )
printf( "failed\n" );
else
printf( "fin=%p\n", fin );
}