管道输出流程的unix管道(|)和我们使用“pipe(int pipefd [2])”创建的管道在c中用于进程间通信吗?
答案 0 :(得分:6)
Shell管道mkdosfs: unable to create floppy.img
是使用|
和pipe(2)
系统调用实现的。
请参阅Unix Pipes。
答案 1 :(得分:5)
它们并不完全相同,因为调用pipe(2)
不足以实现shell |
的等效函数。
pipe(2)
创建两个文件描述符(读取结束和写入结束)。但是,您需要做的不仅仅是实现|
功能。
创建管道的典型顺序如下:
1)使用pipe(2)
创建一个读端和一个写端。
2)使用fork()
创建子进程。
3)父子进程使用dup2()
复制文件描述符。
4)两个流程都关闭管道的一端(每个流程不使用的管道的一端)。
5)一个写入管道和管道中的其他读取。
考虑简单的例子来证明这一点。在这里你传递一个文件名作为参数和父进程" greps"孩子的文件cat
。
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int pipefd[2];
int pid;
char *cat_args[] = {"cat", argv[1], NULL};
char *grep_args[] = {"grep", "search_word", NULL};
pipe(pipefd);
pid = fork();
if (pid != 0)
{
dup2(pipefd[0], 0);
close(pipefd[1]);
execvp("grep", grep_args);
}
else
{
dup2(pipefd[1], 1);
close(pipefd[0]);
execvp("cat", cat_args);
}
}
这相当于做
cat file | grep search_word
在shell上。
答案 2 :(得分:0)
shell使用pipe(2)
系统调用来与|
运算符
|
是shell的实现,它特意使用pipe()
系统调用。