杀死 parent 后关闭文件子描述符?

标签 c linux posix

如何在终止父进程时关闭我的子文件描述符?

我创建了一个执行以下操作的程序:

  1. 派生 2 个子进程。

  2. 进程 1 是一个读取器。它从 STDIN_FILENO 读取并使用 scanf/printf 写入 STDOUT_FILENO。但我使用 dup2 重定向到命名管道(我们称之为 npipe)。

  3. 进程 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);
    }    
}

设法附加正确的信号处理程序,但即使我关闭文件,数据仍未写入!这是为什么?

最佳答案

您的问题(可能)与关闭文件描述符无关,而是与刷新 FILE 指针有关。请注意,FILE 指针和文件描述符是两个不同的东西。

您调用 printf,它不会写入 STDOUT_FILENO(一个文件描述符),它写入 stdout(一个 FILE 指针),它通常只是缓冲数据直到它有理由写入它到底层文件描述符 (STDOUT_FILENO)。

因此,您需要确保写入标准输出的数据实际上写入了 STDOUT_FILENO。最简单的方法是在 printf 调用后粘贴 fflush(stdout); 以手动刷新它,让您可以精细控制何时写入内容。或者,您可以调用 setbuf(stdout, 0); 使 stdout 无缓冲,因此每次写入都会立即刷新。

关于杀死 parent 后关闭文件子描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48871891/

相关文章:

ios - 在 iOS 上打开时得到 -1,为什么?

c++ - 此应用程序无法启动,因为它无法在 "xcb"中找到或加载 Qt 平台插件 ""。并且找不到/usr/lib/qt5

linux - 用/在搜索字符串中替换 bash 文件中的文本

c - POSIX 返回并打印数组 prthread_join()?

将十六进制 C 数组转换为 Matlab vector

c - 字符串的长度作为字符串

python - 从具有相同名称结构的文本文件中读取数据并将所有数据 append 到新文件中

c - 父子进程之间的信号量

linux - 以root身份在/etc/profile.d/at Startup中执行脚本?

linux - clock_gettime 是 UTC 时间还是本地时区?