Pit*_*kos 5 c pipe file-descriptor
最近我开始怀疑我错误地使用了管道的末端:
从手册页:
pipe() 创建一个管道.. ..pipefd[0] 指的是管道的读取端。pipefd[1] 指的是管道的写端。
所以在我的脑海里,我是这样的:
.---------------------------.
/ /\
| pipedfd[0] pipedfd[1]| |
process1 ---> | | -----> process2
| input output| |
\____________________________\/
Run Code Online (Sandbox Code Playgroud)
然而,我在这里的代码和作品表明并非如此:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
int pipedfd[2];
char buf[30];
pipe(pipedfd);
printf("writing to file descriptor #%d\n", pipedfd[1]);
write(pipedfd[1], "test", 5);
printf("reading from file descriptor #%d\n", pipedfd[0]);
read(pipedfd[0], buf, 5);
printf("read \"%s\"\n", buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即它写入管道的输出(?)并从管道的输入(?)读取?
简而言之,交换数字0和1图表中的数字,您就会得到我将在下面描述的内容。
从 Mac OS X 手册页:
pipe() 函数创建一个管道(一个允许单向数据流的对象)并分配一对文件描述符。第一个描述符连接到管道的读端;第二个连接到写端。
写入 fildes[1] 的数据出现在(即,可以从中读取)fildes[0]。这允许将一个程序的输出发送到另一个程序:源的标准输出被设置为管道的写端;接收器的标准输入设置为管道的读取端。管道本身一直存在,直到其所有关联的描述符都关闭。
我将描述它是如何经常使用的,这可能会清除它。想象一下,你有一个进程,想要生成一个子进程,你想向它发送命令。
pipe并获取两个文件描述符。fork以创建子项。
fd[1]) 并打开读取文件描述符。fd[0]) 文件描述符并保持写入打开。fd[1]),而孩子可以读取另一个 ( fd[0])。关闭不是必需的,但通常完成。如果您需要双向通信,您要么需要第二组文件描述符以及对 的第二次调用pipe,要么使用双向通道,如 Unix 域套接字或命名管道。