将管道的读取端重定向到文件描述符

时间:2019-04-05 15:56:20

标签: c pipe io-redirection dup2

我有两个子进程,它们共享其父级的公共管道描述符。关闭结束等没有问题。问题是我希望将管道的读取端重定向到文件描述符,而不是持有缓冲区并将缓冲区的内容写入文件。可能吗?我的代码段如下

// we're sure we can read from fd[0], I did it sucessfully
// I mean there is no problem about the communication

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
if (dup2(open_fd,fd[0]) == -1) {
    perror("error ");
    return 1;
}
if (close(open_fd) == -1) {
    perror("close error");
    return 1;
}

执行上面的代码时,我没有写到名为filename的文件中。顺便说一句,是否需要通过调用close(open_fd)关闭open_fd?由于dup2已将其关闭。

2 个答案:

答案 0 :(得分:1)

您可能误解了dup2的目的。它只是改变了文件描述符的“含义”,因此它现在“指向”与另一个描述符相同的流。但这绝不会将数据从一个文件描述符传输到另一个文件描述符。要真正实现您想要的目标,可以尝试splice

int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
splice(fd[0], NULL, open_fd, NULL, size, 0);

请注意,您必须指定要传输的数据量(上例中的size变量)。

答案 1 :(得分:0)

  

执行上面的代码时,我没有写到名为filename的文件中。

当然不是。调用dup2(open_fd,fd[0])时,您要使存储在fd[0]中的整数值引用open_fd所用的同一文件,但这与馈入字节中发生的操作没有直接关系。管道的写端。通过使最初存储在fd[0]中的文件描述符编号(如果打开)首先关闭,它将仅间接影响它们。

从本质上讲,文件描述符是将整数映射到内核中打开文件描述的表的键。 dup2()更改目标FD映射到的打开文件描述;它不会修改打开的文件描述本身,也不会影响其语义,它位于管道所在的那个级别。

从管道的读取端通过读取获得写入管道的写入端的字节。但是,您这样做时,它们最初位于内存和/或CPU寄存器中。为了使它们从那里转到文件,您需要在其中发送。例如,您可能设置了一个线程,其目的是从管道中读取任何可用的字节,然后将它们写入您的文件中。