Unix IPC包括:管道(pipe)、命名管道(FIFO)與信号(Signal)
管道(pipe)
管道可用于具有親緣關系程序間的通信,有名管道克服了管道沒有名字的限制,是以,除具有管道所具有的功能外,它還允許無親緣關系程序間的通信;
實作機制:
管道是由核心管理的一個緩沖區,相當于我們放入記憶體中的一個紙條。管道的一端連接配接一個程序的輸出。這個程序會向管道中放入資訊。管道的另一端連接配接一個程序的輸入,這個程序取出被放入管道的資訊。一個緩沖區不需要很大,它被設計成為環形的資料結構,以便管道可以被循環利用。當管道中沒有資訊的話,從管道中讀取的程序會等待,直到另一端的程序放入資訊。當管道被放滿資訊的時候,嘗試放入資訊的程序會等待,直到另一端的程序取出資訊。當兩個程序都終結的時候,管道也自動消失。

從原理上,管道利用fork機制建立,進而讓兩個程序可以連接配接到同一個PIPE上。最開始的時候,上面的兩個箭頭都連接配接在同一個程序Process 1上(連接配接在Process 1上的兩個箭頭)。當fork複制程序的時候,會将這兩個連接配接也複制到新的程序(Process 2)。随後,每個程序關閉自己不需要的一個連接配接 (兩個黑色的箭頭被關閉; Process 1關閉從PIPE來的輸入連接配接,Process 2關閉輸出到PIPE的連接配接),這樣,剩下的紅色連接配接就構成了如上圖的PIPE。
代碼實作:
該代碼段實作了将檔案a中的内容讀取到buf1,通過管道寫入到檔案b中。
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include <string.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int fd[2];
int pid;
int fd1;
int fd2;
int size;
char buf[128]={'\0'};
char buf1[128]={'\0'};
if(pipe(fd)==-1)
{
printf("create pipe error\n");
}
pid=fork();
if(pid<0)
{
printf("create error");
}
else if(pid>0)
{
printf("this is father\n");
close(fd[0]);
fd1=open("1.txt",O_RDWR);
read(fd1,(void *)buf1,128);
write(fd[1],buf1,128);
}
else
{
printf("this is child\n");
close(fd[1]);
read(fd[0],(void *)buf,128);
size= strlen(buf);
fd2=open("2.txt",O_RDWR|O_CREAT|O_TRUNC,0600);
write(fd2,buf,size);
printf("%s\n",buf);
}
return 0;
}