2017-07-30 10 views
-2

私は、Cプログラムに2つのファイル、create_open_log_file()write_to_log_file()とグローバルファイルポインタを持っています。c - 子プロセスの内部からファイルにデータを書き込むことができません

これらの関数が呼び出されると、期待どおりにログファイルが作成されます(私はdirでそれを見ることができます)。次にwrite_to_log_file()が呼び出され、子プロセスが作成されます。この時点で、私は文字列test test testがこのファイルにループで書き込まれると予想していました。文字列child processが端末に表示されます。oコードが実行中であることがわかります。ただし、ログファイルには内容はありませんか?

明らかに間違ったことをしているかどうか誰かが私に教えてもらえれば嬉しいです。

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

ファイルのバッファを[* flushing *](http://en.cppreference.com/w/c/io/fflush)してみてください。 –

+0

@alk申し訳ありません - 修正されました。 –

答えて

2

クイックコードレビューから、子プロセスがファイルを閉じないように見えるため、データがファイルに到達することも、到達しないこともあります。

ああ。それは無限ループなので、実際にはクローズするつもりはありません。はい。バッファをフラッシュすると、一般にデータがディスクに送られます。これは、あなたが実際に行っていることです。

2

フラッシングFILEが必要です。さもなければ、あなたの出力はブロックがいっぱいになるまでメモリ(ファイルのバッファブロック)に置かれるか、ファイルポインタfcloseになります。これは、バッファされたstdioと、裸のファイルハンドルの違いの一部です。

関連する問題