匿名管道是進程間通信(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;
}