杀死父进程时,如何关闭子文件描述符?
我创建了一个执行以下操作的程序:
-
分叉2子进程 .
-
过程1是读者 . 它从STDIN_FILENO读取并使用scanf / printf写入STDOUT_FILENO . 但我使用dup2重定向到命名管道(让我们称之为npipe) .
-
过程2是作家 . 我将STDIN_FILENO重定向到npipe,以便我可以使用该管道中的scanf . 我将STDOUT_FILENO重定向到另一个名为“output_file”的文件,以便我可以使用printf进行写入 .
读/写是在while(1)循环中完成的;
while(1){
scanf("%s",word);
printf("%s",word);
}
如果我使用CTRL C(向父节点发送SIGTERM信号),则“output_file”中写入的任何数据都将丢失 . 里面什么都没有 . 我认为这是因为我在文件打开时杀了进程?
我用了一个单词,在读取时停止了两个子进程;在这种情况下,我确实在“output_file”中有所有内容 .
使用SIGTERM时如何关闭文件? /我可以以某种方式强制我的进程写入“output_file”,以便在突然关闭时没有数据丢失吗?
我在每次写作后尝试关闭并打开文件 . 仍在丢失所有书面数据?这是因为重定向吗?
void read_from_pipe(void)
{
char command[100];
int new_fd = open(pipe_name,O_RDONLY,0644);
int output_file = open("new_file",O_CREAT|O_WRONLY|O_APPEND,0644);
dup2(new_fd,0);
dup2(output_file,1);
while(1)
{
scanf("%s",command);
if(strcmp(command,"stop")==0)
{
close(output_file);
close(new_fd);
exit(0);
}
else
printf("%s ",command);
close(output_file);
output_file = open("new_file",O_CREAT|O_WRONLY|O_APPEND,0644);
}
}
管理附加正确的信号处理程序,但即使我关闭我的文件仍然没有写入数据!这是为什么?
1 回答
您的问题(可能)与关闭文件描述符无关,而是刷新FILE指针 . 请注意,FILE指针和文件描述符是两个不同的东西 .
您调用
printf
,它不写入STDOUT_FILENO(文件描述符),它写入stdout(一个FILE指针),它通常只缓冲数据,直到它有理由将其写入底层文件描述符(STDOUT_FILENO) .因此,您需要确保写入stdout的数据实际上写入STDOUT_FILENO . 最简单的方法是在printf调用后粘贴一个
fflush(stdout);
来手动冲洗它,让你对写入的东西进行细粒度的控制 . 或者,您可以调用setbuf(stdout, 0);
使stdout无缓冲,因此每次写入都会立即刷新 .