匿名管道:
pipe()函数可用于创建一个管道,以实现进程间的通信。
头文件是#include<unistd.h>,参数是int类型的数组
fd[0]表示读端
fd[1]表示写端
如下代码使用pipe函数创建管道,并打印出来,最后关闭终端。
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int ret;
int fd[2];
ret=pipe(fd);
if(ret==-1)
{
printf("create pipe failed!\n");
exit(1);
}
printf("pipe[0] is %d\n",fd[0]);
printf("pipe[1] is %d\n",fd[1]);
close(fd[0]);
close(fd[1]);
return 0;
}
打印出来的读端是3,写端是4
这是因为系统的文件描述符前3个已经有对应的标准IO。
如下代码是使用pipe创建管道完成父子进程管道通信实现 ps aux| grep "bash" (数据重定向:dup2)
1.父进程是写端,就要先关闭读端(close(f[0])),然后对写端进行数据重定向设置为标准输出,
用execlp函数在代码里执行代码
2.子进程是读端,就要先关闭写端(close(f[1])),然后对读端进行数据重定向设置为标准输入,
用execlp函数在代码里执行代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int ret;
int fd[2];
ret=pipe(fd);
if(ret==-1)
{
printf("create pipe failed!\n");
exit(1);
}
pid_t pid =fork();
if(pid==-1)
{
printf("create porcess failed");
exit(1);
}
if(pid>0)
{
close(fd[0]);
dup2(fd[1],STDOUT_FILENO);
execlp("ps","ps","aux",NULL);
perror("execlp");
exit(1);
}
else if(pid==0)
{
close(fd[1]);
dup2(fd[0],STDIN_FILENO);
execlp("grep","grep","bash",NULL);
perror("execlp");
exit(1);
}
printf("pipe[0] is %d\n",fd[0]);
printf("pipe[1] is %d\n",fd[1]);
close(fd[0]);
close(fd[1]);
return 0;
}
运行代码后可以看到完成父子进程的通信实现了ps aux | grep bash 。