Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 重定向管道';s文件描述符的读取端_C_Pipe_Io Redirection_Dup2 - Fatal编程技术网

C 重定向管道';s文件描述符的读取端

C 重定向管道';s文件描述符的读取端,c,pipe,io-redirection,dup2,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_CREA

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

// 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\u fd)
来关闭open\u fd?因为
dup2
已经关闭了它。

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

请注意,您必须指定要传输的数据量(
size
variable,在上面的示例中)

当我编写上述代码时,我不会写入名为
filename
的文件

当然不是。当调用
dup2(open\u fd,fd[0])
时,可以使存储在
fd[0]
中的整数值引用与
open\u fd
相同的文件,但这与馈入管道写入端的字节的情况没有直接关系。如果文件描述符的值最初存储在
fd[0]
中,则会首先关闭该文件描述符,从而间接影响它们

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


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

通常,您会执行
dup2(a,b);关闭(a)
。做
dup2(a,b);关闭(b)
没有任何意义。@williampersell谢谢,先生,我编辑了它。那么,现在的问题是什么?我该怎么办?你不能通过复制文件描述符神奇地将管道变成文件。@IanAbbott那么我应该分别持有缓冲区、读取缓冲区、打开文件进行写入和写入文件吗??或者我该怎么办?@concurrency,这要看情况而定。为什么首先需要创建管道?尽管它是特定于Linux的,但还是巧妙地使用了
splice
int open_fd = open(filename, O_WRONLY|O_CREAT, 0666);
splice(fd[0], NULL, open_fd, NULL, size, 0);