我有两个子进程,它们共享其父级的公共管道描述符。关闭结束等没有问题。问题是我希望将管道的读取端重定向到文件描述符,而不是持有缓冲区并将缓冲区的内容写入文件。可能吗?我的代码段如下
// 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
已将其关闭。
答案 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寄存器中。为了使它们从那里转到文件,您需要在其中发送。例如,您可能设置了一个线程,其目的是从管道中读取任何可用的字节,然后将它们写入您的文件中。