如何在终止父进程时关闭子文件描述符?
我创建了一个执行以下操作的程序:
分叉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);
}
}
管理附加正确的信号处理程序,但即使关闭文件,数据仍然没有写入!那是为什么?
答案 0 :(得分:1)
你的问题(很可能)与关闭文件描述符无关,而是用刷新FILE指针。请注意,FILE指针和文件描述符是两回事。
你调用printf
,它不写入STDOUT_FILENO(文件描述符),它写入stdout(一个FILE指针),它通常只是缓冲数据,直到它有理由将它写入底层文件描述符(STDOUT_FILENO)。
因此,您需要确保写入stdout的数据实际写入STDOUT_FILENO。最简单的方法是在printf调用之后粘贴fflush(stdout);
以手动刷新它,让您对写入内容时进行细粒度控制。或者,您可以调用setbuf(stdout, 0);
使stdout无缓冲,因此每次写入都会立即刷新。