1. 程式人生 > 其它 >07LinuxC程序間通訊之管道pipe多個寫端或者多個讀端,案例4(非常重要)

07LinuxC程序間通訊之管道pipe多個寫端或者多個讀端,案例4(非常重要)

技術標籤:多程序unix

概述:
實際上我們多程序的管道使用時,是可以同時有多個讀端和寫端的。但是這個例子在平時不常用。下面我們只演示多個寫端和一個讀端的案例。

1 一個讀端多個寫端案例

是否允許,一個pipe有一個寫端,多個讀端呢?是否允許有一個讀端多個寫端呢?
前面已經說了,是允許的。

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
	pid_t pid;
int fd[2], i, n; char buf[1024]; int ret = pipe(fd); if(ret == -1){ perror("pipe error"); exit(1); } for(i = 0; i < 2; i++){ if((pid = fork()) == 0) break; else if(pid == -1){ perror("pipe error"); exit(1); } } if (i == 0) { close(fd[0]); write
(fd[1], "1.hello\n", strlen("1.hello\n")); } else if(i == 1) { close(fd[0]); write(fd[1], "2.world\n", strlen("2.world\n")); } else { close(fd[1]); //父程序關閉寫端,留讀端讀取資料 //sleep(1);//不加sleep的話,可能兄程序或者弟程序某個寫入後,父程序直接讀,然後回收兄弟程序後就結束了。導致下一次的資料無法再讀取了。 n =
read(fd[0], buf, 1024); //從管道中讀資料 write(STDOUT_FILENO, buf, n); for(i = 0; i < 2; i++) //兩個兒子wait兩次 wait(NULL); } return 0; }

可以看到,不加sleep時結果可能列印不全或者內容不一樣。
在這裡插入圖片描述
加上sleep後。雖然結果都是hello之後才world,但是也有可能是先world才hello,只不過因為迴圈因為i是先建立兄程序,所以hello的先打的概率比較大。
在這裡插入圖片描述