匿名管道是进程间通信(IPC)的一种方式。基本思想是利用内存中共享的一段缓冲区,以文件的方式对缓冲区实现,但因为该文件只存在内存中,无唯一命名,所以称为匿名。
优点:可以进行IPC通信,且相对来说简单;
缺点:半双工方式,即只能单向通信;只能在亲属关系的进程间使用,例如父子进程、兄弟进程。
应用场景:在具备亲属关系的进程间单向通信。如果需要进行双向通信,需要创建两个管道。
原理:首先父进程创建管道fd,父进程采用fork的方式创建子进程,子进程是父进程的副本,所以文件描述符也是复制的,类似于对文件描述符执行dup函数,共享文件表项。因为父子进程共享同一文件表项(缓冲区),所以父子进程可实现通信。
以上图例完成父进程向管道写入,子进程读取管道的单向通信的功能。
使用示例:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd[2];
int iRet = pipe(fd);
if(iRet == -1)
{
printf("pipe failed!\n");
return -1;
}
pid_t pid = fork();
if(pid < 0)
{
printf("fork failed!\n");
return -1;
}
else if(pid == 0)
{
close(fd[1]);
char data[1024];
size_t readBytes = read(fd[0],data,sizeof(data));
if(readBytes == 0)
{
printf("read failed!\n");
return -1;
}
printf("child process receive data:%s\n",data);
}
else
{
close(fd[0]);
const char *sendData = "parent process send data to child process";
size_t writeBytes = write(fd[1],sendData,strlen(sendData)+1);
if(writeBytes == 0)
{
printf("send failed!\n");
return -1;
}
printf("send data to child process success.\n");
}
getchar();
return 0;
}