首页 文章

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

提问于
浏览
0

杀死父进程时,如何关闭子文件描述符?

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

  • 分叉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);
    }    
}

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

1 回答

  • 1

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

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

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

相关问题