什么是管道:
管道是Unix中最古老的进程间通信的形式。
我们把从一个进程链接到另外一个进程的一个数据流称为管道。
本质是有固定大小的内核缓存区。
管道的限制
管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立起两个管道
只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信,通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可以用管道。
匿名管道pipe
包含头文件
功能:创建一无名管道
原型:
int pipe(int fd[2]);
参数
fd:文件描述符数组,其中fd[0]表示读端,fd[1]表示写端。
返回值:成功返回0,失败返回错误代码。
国际惯例:上个代码
#include #include #include #include #include #include #include #include #include #include #include #include #define ERR_EXIT(m)\
do \
{ \
perror(m);\
exit(EXIT_FAILURE);\
}while(0)
int main()
{
int pipefd[2];
if(pipe(pipefd) == -1)
{
ERR_EXIT("pipe error");
}
pid_t pid;
pid = fork();
if(pid == 0)
{
close(pipefd[0]);
write(pipefd[1],"hello",5);
close(pipefd[1]);
exit(EXIT_SUCCESS);
}
close(pipefd[1]);
char buf[10] = {0};
read(pipefd[0],buf,10);
printf("buf = %s\n",buf);
return 0;
}
解释一波:
本次实验是子进程写一个字符串,父进程打印出来。
从主函数开始解释:
int pipefd[2];
if(pipe(pipefd) == -1)
{
ERR_EXIT("pipe error");
}
第一行代码是先创建一个数组,为的就是pipe的参数。if(pipe(pipefd)==-1)这行代码的意思就是创建一个管道,如果失败的打印错误信息。
pid_t pid;</