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

问题描述 投票:0回答:2

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

// 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已经关闭它。

c pipe io-redirection dup2
2个回答
1
投票

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

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

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


0
投票

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

当然不是。当你调用dup2(open_fd,fd[0])时,你使存储在fd[0]中的整数值引用open_fd所做的相同文件,但这与输入到管道写端的字节发生的事情无关。它只是间接地影响它们,方法是使其最初存储在fd[0]中的值的文件描述符号在打开时首先被关闭。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.