2013-11-25 78 views
0

緩衝IO流在fork()上有奇怪的行爲。fork()和緩衝IO流

在下面顯示的示例代碼片段中,正在讀取的文件大小爲252個字節。在fork()之後,孩子正在成功地閱讀一條線並在屏幕上進行打印。但是,當控件返回到父項時,由於某種原因,文件偏移量被設置爲文件的結尾,並且父進程無法從流中讀取任何內容。如果fork()創建了一個文件描述符的副本(可以使用系統調用read()write()複製相同的程序,可以正常工作),可以期望父進程從流中讀取下一行,但這似乎並未發生。當控件到達父級時,文件偏移量被設置爲文件末尾。有人可以對此有所瞭解嗎?

int main(void) 
{  
    char buffer[80]; 
    FILE *file; 
    pid_t pid; 
    int status; 

    /* Open the file: */ 
    file = fopen(FILENAME, "r"); 

    if ((pid = fork()) == 0){ 
     fgets(buffer, sizeof(buffer), file); 
     printf("%s", buffer); 
    } 
    else{ 
     waitpid(pid, &status, 0); 
     printf("Offset [%d]\n", ftell(file)); 

     fgets(buffer, sizeof(buffer), file); 
     printf("%s", buffer); 
    } 
} 

回答

0

子進程中的fgets()完全緩衝,因爲它從文件讀取數據。在我的系統上,一個完全緩衝的緩衝區大小爲1024 ..因此,一個read()包含fgets()緩衝區中文件的全部內容(252個字節)。所以當控件回到父對象時,偏移量被設置爲文件的結尾。

在子進程返回前做一個fflush()函數,確保fgets()緩衝區中的數據被丟棄,因此當控件到達父級時,會正確設置文件名稱。