杀死 parent 后关闭文件 child 描述符?
Closing file child descriptors after killing parent?
如何在终止 parent 进程时关闭我的 child 文件描述符?
我创建了一个执行以下操作的程序:
分叉 2 child 个进程。
进程 1 是 reader。它从 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(向 parent 发送 SIGTERM 信号),写入 "output_file" 的任何数据都会丢失。里面什么也没有。我认为这是因为我在打开文件时终止了进程?
我使用了一个在阅读时停止两个 child 进程的词;在这种情况下,我的 "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);
}
}
设法附加了正确的信号处理程序,但即使我关闭了文件,数据仍未写入!这是为什么?
您的问题(可能)与关闭文件描述符无关,而是与刷新 FILE 指针有关。请注意,FILE 指针和文件描述符是两个不同的东西。
你调用 printf
,它不会写入 STDOUT_FILENO(一个文件描述符),它会写入 stdout(一个 FILE 指针),它通常只是缓冲数据直到它有理由将其写入底层文件描述符 (STDOUT_FILENO)。
因此您需要确保写入标准输出的数据实际写入 STDOUT_FILENO。最简单的方法是在 printf 调用后粘贴一个 fflush(stdout);
以手动刷新它,让您 fine-grained 控制何时写入内容。或者,您可以调用 setbuf(stdout, 0);
使 stdout 无缓冲,因此每次写入都会立即刷新。
如何在终止 parent 进程时关闭我的 child 文件描述符?
我创建了一个执行以下操作的程序:
分叉 2 child 个进程。
进程 1 是 reader。它从 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(向 parent 发送 SIGTERM 信号),写入 "output_file" 的任何数据都会丢失。里面什么也没有。我认为这是因为我在打开文件时终止了进程?
我使用了一个在阅读时停止两个 child 进程的词;在这种情况下,我的 "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);
}
}
设法附加了正确的信号处理程序,但即使我关闭了文件,数据仍未写入!这是为什么?
您的问题(可能)与关闭文件描述符无关,而是与刷新 FILE 指针有关。请注意,FILE 指针和文件描述符是两个不同的东西。
你调用 printf
,它不会写入 STDOUT_FILENO(一个文件描述符),它会写入 stdout(一个 FILE 指针),它通常只是缓冲数据直到它有理由将其写入底层文件描述符 (STDOUT_FILENO)。
因此您需要确保写入标准输出的数据实际写入 STDOUT_FILENO。最简单的方法是在 printf 调用后粘贴一个 fflush(stdout);
以手动刷新它,让您 fine-grained 控制何时写入内容。或者,您可以调用 setbuf(stdout, 0);
使 stdout 无缓冲,因此每次写入都会立即刷新。