【发布时间】:2018-02-19 18:08:16
【问题描述】:
杀死父进程时如何关闭子文件描述符?
我创建了一个执行以下操作的程序:
分叉 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”的数据都会丢失。里面什么都没有。我认为这是因为我在打开文件时杀死了进程?
我使用了一个词,在读取时会停止两个子进程;在这种情况下,我的“输出文件”中确实包含所有内容。
使用 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);
}
}
设法附加正确的信号处理程序,但即使我关闭我的文件,数据仍然没有写入!这是为什么呢?
【问题讨论】:
-
您需要安装一个信号处理程序,以确保您的文件在退出时关闭。
-
试图这样做,但似乎孩子们没有注意到它。另外,我不知道如何为同一个信号的两个孩子制作不同的处理程序。
-
如果您在安装信号处理程序后 fork 进程,您的子进程将拥有信号处理程序。然后,您可以在您的父级中安装另一个处理程序,将信号传播给子级。此外,您可以使用 FSYNC 标志打开文件。
-
是的,有道理!那将是一个自然的解决方案;好的,但是我尝试了下一件事,但又出现了问题……每次写入后我都关闭了文件,但文件中仍然没有写入数据..
-
“父亲”?为什么不使用标准的“parent”?