c-无法从子进程内部将数据写入文件

c-无法从子进程内部将数据写入文件,c,file,fork,parent-child,C,File,Fork,Parent Child,我在c程序中有两个功能,create\u open\u log\u file()和write\u to\u log\u file()和一个全局文件指针 当调用这些函数时,将按预期创建日志文件(我可以在目录中看到它)。然后调用write\u to\u log\u file(),并创建一个子进程。此时,我希望字符串test将以循环方式写入该文件。字符串子进程打印在终端上,我知道代码正在执行。但是,日志文件没有内容 如果有人能告诉我我是否做错了什么,我会很感激的 FILE *log_file; st

我在c程序中有两个功能,
create\u open\u log\u file()
write\u to\u log\u file()
和一个全局文件指针

当调用这些函数时,将按预期创建日志文件(我可以在目录中看到它)。然后调用
write\u to\u log\u file()
,并创建一个子进程。此时,我希望字符串
test
将以循环方式写入该文件。字符串
子进程
打印在终端上,我知道代码正在执行。但是,日志文件没有内容

如果有人能告诉我我是否做错了什么,我会很感激的

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
}
}
文件*log\u文件;
静态void创建\打开\日志\文件(void){
字符文件名[40];
时间t=时间(空);
struct tm*tm=本地时间(&t);
chars[64];
strftime(s,sizeof(s),%a%b%d%T”,tm);
sprintf(文件名,“dut1\u串行\u日志%s”,s);
log_file=fopen(文件名,“w”);
if(log_file==NULL){
perror(“创建日志文件时出错”);
}
}
静态写入日志文件(){
//防止被终止的子进程保持为“已失效”
结构SIGCHAction sigchld\U操作={
.sa_handler=SIG_DFL,
.sa_flags=sa_NOCLDWAIT
};
SIGCHLD和SIGCHLD_动作,空;
//复制(“fork”)进程。将在子进程中返回零
//进程和父进程中子进程的PID(或错误时为负数)。
int-pid=fork();
全局pid=pid;
if(pid<0){
printf(“Fork失败\n”);
返回1;
}
//------子进程
如果(pid==0){
//------子进程
//打开日志文件并从/dev/USB1写入
创建_open_log_文件();
而(1){
printf(“子进程”);
字符str[]=“测试”;
fwrite(str,1,sizeof(str),log_文件);
睡眠(1);
}
返回0;//从未到达
}
}

快速查看代码,子进程似乎从未关闭文件,因此数据可能会或可能不会到达文件


啊。因为这是一个无限循环,所以你真的不想结束。对刷新缓冲区通常会将数据一直保存到磁盘,我猜这才是您真正想要的。

需要刷新
文件
;否则,您的输出将一直保存在内存(文件的缓冲块)中,直到块被填满,或者您将
fclose
文件指针。这就是缓冲stdio和裸文件句柄之间的部分区别

请清理代码的缩进。预览对你不起作用吗?试试文件的缓冲区。@alk抱歉-现在修复。@Someprogrammerdude-谢谢你刷新了缓冲区。@articsol:“现在修复”不是真的。。。