匿名管道:匿名管道是具有关系的进程之间的通信方式,比如父子进程、兄弟进程等等。匿名管道需要输出一个数组。此数组是输出参数。在此数组中会分别保存管道读写端的文件描述符(在Linux中一切皆文件)。
使用方法:使用pipe(int pipepid[2])函数来创建管道。管道创建成功时返回0,否则返回-1,并设置对应的错误编号。输出参数pipepid[0]是管道读端的文件描述符,pipepid[1]是管道写端的文件描述符。对于文件,可以使用文件操作函数read和write函数来写入和读取数据。
程序设计:父子进程之间利用匿名管道进行通信的代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main()
{
//创建匿名管道,注意匿名管道只能在具有关系的进程之间进行通信,比如父子进程,兄弟进程等等
int pipepid[2];
/*pipepid为输出参数,也就是在pipe函数中会给pipepid两个值,分别为管道的读、写端口。
在Linux中,一切皆文件,所以pipe赋值个pipepid的是管道文件的读写端的文件描述符*/
int res=pipe(pipepid);
if(res==-1)
{
perror("pipe");
exit(0); //退出进程
}
//创建子进程
pid_t ret=fork();
if(ret > 0)
{
printf("i am parent,pid=%d\n",getpid());
//父进程
while(1)
{
char buf1[1024]={0};
char *parent="hello child";
write(pipepid[1],parent,strlen(parent));
sleep(1);
int len1=read(pipepid[0],buf1,sizeof(buf1));
printf("parnt receive:%s,pid=%d\n",buf1,getpid());
sleep(1);
}
}
else if(ret == 0)
{
printf("i am child,pid=%d\n",getpid());
char child[1024]={0};
//子进程
while (1)
{
int len=read(pipepid[0],child,sizeof(child));
printf("child receive:%s, pid=%d \n",child,getpid());
char *chidl1="hello parent";
write(pipepid[1],chidl1,strlen(chidl1));
sleep(1);
}
}
return 0;
}
运行结果:
总结:
匿名管道是具有关系的进程之间的一种通信方式。对于管道文件的操作同其他的普通文件的操作一样,比如read和write。