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

时间:2018-02-19 18:08:16

标签: 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来写了。

  4. 读/写是在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 个答案:

答案 0 :(得分:1)

你的问题(很可能)与关闭文件描述符无关,而是用刷新FILE指针。请注意,FILE指针和文件描述符是两回事。

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

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