私は、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
}
}
コードのインデントをクリーンアップしてください。プレビューはあなたのために働いていませんか? – alk
ファイルのバッファを[* flushing *](http://en.cppreference.com/w/c/io/fflush)してみてください。 –
@alk申し訳ありません - 修正されました。 –