l 每個程序都有各自的使用者位址空間,各個程序間的全局變量互相之間都看不到,是以不同程序間通信必須經過核心,在核心開辟一塊緩存區,一個程序将資料從使用者空間拷貝到核心緩存區,另一個程序從核心緩存區把資料取走,這種通信機制為程序間通信。
l 管道是程序間通信的一種方法,主要用于父子程序。即通過fork()建立的父子間的通信。
l 管道的建立
#include<unistd.h>
Int pipe(int fd[2])
傳回值:成功傳回0,出錯傳回-1
Fd參數傳回兩個檔案的描述符,fd[0]指向管道的讀端,fd[1]指向管道的寫道,fd[1]的輸出是fd[0]的輸入。
l 管道實作程序間通信
1. 父程序建立管道,得到兩個檔案描述符指向管道的兩端;
2. 父程序fork出子程序,子程序也有兩個檔案描述符指向同管道;
3. 父程序關閉fd[0],子程序關閉fd[1],即子程序關閉管道的讀端,父程序關閉管道的寫端,(管道隻支援單向通信)。子程序向管道寫資料,父程序從管道讀資料。管道是環形隊列實作的。
l 管道特點
1. 管道隻支援父子程序通信,
2. 管道隻支援單向通信;
3. 管道面向位元組流;
4. 管道随程序,程序在管道在,程序消失管道對應的端口關閉,兩個程序都消失管道也消失。
l 管道通信代碼
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
int fd[2];
int pipe_id=pipe(fd);
if(pipe_id==-1)
perror("pipe error\n");
return -1;
}
pid_t id=fork();
if(id==0)
int i=0;
close(fd[0]);
char* child_fork="I am child fork!";
while(i<5)
write(fd[1],child_fork,strlen(child_fork)+1);
sleep(2);
i++;
else if(id>0)
close(fd[1]);
char msg[100];
int j=0;
while(j<5)
memset(msg,'\0',sizeof(msg));
ssize_t s=read(fd[0],msg,sizeof(msg));
if(s>0)
msg[s-1]='\0';
printf("%s\n",msg);
j++;
else
perror("fork error\n");
return 0;
l