退出函数后如何在c中保持文件句柄打开

时间:2015-02-05 22:17:50

标签: c linux procfile

我试图定期读取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;
}

3 个答案:

答案 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所拥有的openerfin所拥有的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 );
}