0

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;
}
4

3 に答える 3

0

C 言語は引数を値で渡すので、finthat has はthat openerhas のコピーです。in を変更しても、main のコピーには影響しません。finmainfinopener

1 つの解決策は、一時ファイル ポインターを使用してから、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 );
}
于 2015-02-05T22:30:23.743 に答える