无名管道(PIPE)只是用于父子进程间通讯
PIPE是Linux进程间通信方法之一,是一个单向通道,先进先出,管道的尾端为写端,描述符pipe_fd[1] . 头部为读端,描述符为pipe_fd[0](注意,强制规定)
主要函数 :pipe(pipe_fd) //创建无名管道
下面介绍一个小例子:
程序功能:在父进程中创建一无名管道,并创建子进程来读该管道,父进程来写该管道
源码:
#include<unistd.h>
#include<sys/types.h>
#include<errno.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int pipe_fd[2];
pid_t pid;
char buf_r[100];
char p_wbuf;
int r_num;
memset(buf_r,0,sizeof(buf_r));
/*创建管道*/
if(pipe(pipe_fd)<0)
{
printf(pipe create error\ n")∶
return 1;
}
/*创建子进程*/
if((pid=fork())==0) //子进程执行序列
{
pontf("\n");
dose(pipe_fd[1]); //子进程先关闭了管道的写端
sleep(2); //让父进程先运行,这样父进程先写子进程才有内容读
if(r_num=read(pipe_fd[0],buf_r,100))>0)
{
printf("%d numbers read from the plpe is %s\n",r_num,buf_r);
}
close(pipe_fe[0]);
exit(0);
}
else if(pid>0) //父进程执行序列
{
close(pipe_fd[0]); //父进程先:关闭了管道的读端
if(write(pipe_fd[1],"Hello",5)!=-1)
printf("parent write 1 Hello!\n");
if(write(pipe_fd[1],"Pipe",5)!=-1)
printf("parent write 2 Pipe!\n");
close(pipe_fd[1]);
waitpid(pid,NULL,0); //等待子进程结束
exit(0);
}
return O;
}
结果:
上述代码中父进程关闭管道的读端,子进程关闭管道的写端(想想为什么这么做???)
答:由于fork函数让子进程完整地拷贝了父进程的整个地址空间,所以父子进程都有管道的读端和写端。我们往往希望父子进程中的一个进程写一个进程读,那么写的进程最好关闭掉读端,读的进程最好关闭掉写端。再来看代码:我们是从父进程向子进程写数据,所以我们关闭了子进程的写端pipe_fd[1]和父进程的读端pipe_fd[0]