2017-07-30 78 views
-2

我在c程序中有兩個爐臺,create_open_log_file()write_to_log_file()以及一個全局文件指針。c - 無法將數據寫入子進程內的文件

當這些函數被調用時,日誌文件按預期創建(我可以在目錄中看到它)。然後調用write_to_log_file()並創建子進程。在這一點上,我會預期字符串test test test將被寫入該文件中的一個循環。字符串child process打印在終端o我知道代碼正在執行。但是,日誌文件沒有內容?

我會appreicate是否有人可以告訴我,如果我做一些明顯的錯誤。

FILE *log_file; 

static void create_open_log_file(void) { 

char filename[40]; 
time_t t = time(NULL); 
struct tm *tm = localtime(&t); 
char s[64]; 
strftime(s, sizeof(s), "%a%b%d%T", tm); 
sprintf(filename, "dut1_serial_log_%s", s); 

log_file = fopen(filename,"w"); 

if (log_file == NULL) { 
    perror("Error creating log file"); 
} 

} 




static write_to_log_file() { 


// Prevent killed child-processes remaining as "defunct" 
struct sigaction sigchld_action = { 
     .sa_handler = SIG_DFL, 
     .sa_flags = SA_NOCLDWAIT 
}; 
sigaction(SIGCHLD, &sigchld_action, NULL) ; 


// Duplicate ("fork") the process. Will return zero in the child 
// process, and the child's PID in the parent (or negative on error). 
int pid = fork(); 
global_pid = pid; 
if(pid < 0) { 
    printf("Fork failed\n") ; 
    return 1 ; 
} 


// ------------ Child process 
if(pid == 0) { 
    // ------------ Child process 

    // Open log file and write to it from /dev/USB1 

    create_open_log_file(); 

    while(1) { 
     printf("child process\n") ; 

     char str[] = "test test test"; 

     fwrite(str , 1 , sizeof(str) , log_file); 


     sleep(1) ; 
    } 
    return 0 ; //never reached 
} 
} 
+1

請清理代碼的縮進。預覽不適合你嗎? – alk

+1

嘗試[*清空*](http://en.cppreference.com/w/c/io/fflush)文件的緩衝區。 –

+0

@alk抱歉 - 現在修復。 –

回答

2

從快速代碼審查,它看起來像子進程從不關閉文件,因此數據可能會或可能不會到達該文件。

啊。既然它是一個無限循環,你真的不打算結束。是。刷新緩衝區通常會將數據全部獲取到磁盤,這是我猜測的是你真正想要的。

2

沖洗a FILE是必要的;否則你的輸出只是在內存中(文件的緩衝塊),直到塊被填滿,或者你的文件指針爲止。這是緩衝stdio和裸文件句柄之間差異的一部分。