2015-02-05 60 views
0

我試圖以定期的間隔讀取proc文件/ proc/stat,但我想避免每次我想訪問它時都必須打開和關閉proc文件。如何保持文件句柄在退出函數後在c中打開

我想以某種初始化函數打開文件,然後繼續在其他函數中使用它,然後關閉它。

似乎通過函數打開的文件句柄在函數退出時關閉 如何讓它保持打開狀態?

請讓我知道我是否應該在一些其他的方式做的什麼,我試圖做

樣本:在C

#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

該文件將保持打開狀態直到您調用'fclose',您不需要... – Macmade 2015-02-05 22:20:14

+0

爲什麼你有C++標記?也就是說,你傳遞了被複制的指針,對一個副本的更改對原始文件沒有影響。研究「引用參考」。 – 2015-02-05 22:20:20

+0

只是一個側面說明:你錯過了包含'sleep()'的''。省略它不便攜。 – 2015-02-05 22:21:55

回答

1

函數是按值傳遞。所以,當你將一個文件句柄傳遞給一個函數時,它會收到該句柄的一個副本並將在本地進行更新。如果你想要這些更新傳播給你的調用者,你需要傳遞文件句柄指針。所以,你的開放式會是什麼樣子:

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; 
    } 
/... 
} 
0

您需要將引用傳遞到指針,以保持其在主給散熱鰭片。

if(opener(&fin)) {} 

把它作爲雙指針:

int opener(FILE **fin) {} 

,並用它來與derefencing

*fin = fopen("/proc/stat", "r"); 

否則你發起它每次你打電話給你subfonction。

0

C語言按值傳遞參數,所以該fin具有openerfinmain具有的副本。在opener中更改fin對main的副本沒有影響。

一種解決方案是在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); 
} 
相關問題