定義:
1、管道是單向的,先進先出的,它把一個進程的輸入和一個進程的輸出連接在一起。
一個進程(寫進程)在管道的尾部寫入數據,另一個進程(讀進程)在管道的頭部讀取數據
2、數據被一個進程讀出後,將從管道中刪除,其他進程將不能進行讀取,當讀空管道或在寫入數據時管道已滿將堵塞
3、管道包括有名管道和無名管道,無名管道只能用於父子進程之間的通信,有名管道可以用於一個系統中任意兩個管道之間的通信
4、無名管道用pipe()函數創建,當一個管道創建時,會自動創建2個文件描述符,fd[0]用於讀管道,fd[1]用於寫管道
5、管道用於不同進程之間的通信,通常先創建一個管道,在通過fork()函數創建子進程,該子進程會繼承父進程所創建的管道
6、必須在系統調用fork()函數前調用pipe()函數,否則將不會繼承文件描述符
程序實例
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd[2]; //管道的2個文件描述符
char buf_r[100];
char *p_wbuf;
int r_num;
pid_t pid; //
char str[100];
memset(buf_r,0,sizeof(buf_r));
if(pipe(fd) < 0)
{
perror("pipe error");
exit(-1);
}
if((pid = fork()) == 0) //創建子進程成功
{
close(fd[1]); //關閉寫
sleep(2);
if((r_num = read(fd[0],buf_r,100)) > 0)
{
printf("%d numbers read from the pipe is :%s\n",r_num,buf_r);
close(fd[0]);
exit(0);
}
}
else if(pid > 0)
{
close(fd[0]);
printf("please input a string:\n");
scanf("%s",str);
if(write(fd[1],str,sizeof(str)) != -1)
{
printf("write pipe sucess\n");
}
close(fd[1]);
sleep(2);
waitpid(pid,NULL,0);
}
return 0;
}