是unix管道(|)和我们使用“创建”创建的管道;管道(int pipefd[2])”;在c语言中是一样的吗?
unix管道(|)将一个进程的输出管道化到另一个进程,我们在c中使用“管道(int pipefd[2])创建的管道用于进程间通信吗?Shell管道是unix管道(|)和我们使用“创建”创建的管道;管道(int pipefd[2])”;在c语言中是一样的吗?,c,unix,pipe,C,Unix,Pipe,unix管道(|)将一个进程的输出管道化到另一个进程,我们在c中使用“管道(int pipefd[2])创建的管道用于进程间通信吗?Shell管道|是使用管道(2)和dup2(2)系统调用实现的 请参阅。Shell使用管道(2)系统调用与|操作符进行管道连接 |是shell的实现,它主要使用pipe()syscall 在调用管道(2)不足以实现shell的|的等效功能的意义上,它们并不完全相同 创建两个文件描述符(读端和写端)。但要实现|功能,您需要做的还不止这些 创建管道的典型顺序如下所示:
|是使用管道(2)
和dup2(2)
系统调用实现的
请参阅。Shell使用管道(2)
系统调用与|
操作符进行管道连接
|
是shell的实现,它主要使用pipe()
syscall 在调用管道(2)
不足以实现shell的|
的等效功能的意义上,它们并不完全相同
创建两个文件描述符(读端和写端)。但要实现|
功能,您需要做的还不止这些
创建管道的典型顺序如下所示:
1) 使用管道(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);
}
}
在外壳上。为什么要创建副本?我们不能在不进行复制的情况下写入和读取数据吗?在所有的父子进程通信中,这并不是严格必需的(dup2()
)。你的父母和孩子也可以直接沟通。例如,父级可以将(2)
写入管道的写入端,子级可以从读取端读取(2)
。@PsAkshay因为执行的grep和cat只从0和1读取/写入,而不是从管道fd读取/写入。
cat file | grep search_word