c-无法从子进程内部将数据写入文件
我在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
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:“现在修复”不是真的。。。