無名管道pipe和有名管道FIFO

定義:

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章