天天看點

linux中的程序間通信-管道

作者:見字如瘋

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

繼續閱讀