#include#include#includeint main()
; //定義乙個陣列,作為管道的兩端(讀端和寫端)
int count = 0; //用結果直觀來看管道通訊
int ret; //返回讀寫的返回值
pipe(fd); //建立管道
pid = fork(); //建立程序
//注意:要在建立程序之前建立管道,這樣是建立乙個管道,子父程序分別對應讀寫端。如果寫在後面,程式就會分別在子父程序中建立管道,導致通訊失敗。
if(-1 == pid) //建立程序失敗
else if(0 == pid) //子程序 }
else //父程序
count++;
printf("parent process count :%d \n",count);
waitpid(pid,null,0); //暫停目前的程序,直到子程序結束(相當於收屍子程序)
} return 0;
}執行結果:
child process count:1
parent process count :2
讀檔案:
#include #include #include #include#include#include#includeint main()
; ret = mkfifo("fifo.tmp",o_creat|o_excl); //mkfifo()使用路徑名稱建立乙個fifo特殊檔案,模式指定了fifo的許可權。這個檔案類似於乙個管道,但是它是以一種不同的方式在乙個管道中建立的,而不是作為乙個匿名的通訊渠道,通過呼叫mkfifo()將乙個fifo特殊檔案輸入到檔案系統中。一旦您以這種方式建立了fifo特殊檔案,任何程序都可以開啟它閱讀或寫作,就像普通的檔案一樣。但是,在你對其進行任何輸入或輸出操作之前它必須同時在兩端同時開啟。開啟乙個fifo的讀取通常會阻塞,直到其他程序開啟相同的fifo對於寫作,反之亦然。
if(-1 == ret)
fd = open("fifo.tmp",o_rdonly); //以唯讀的方式開啟
if(-1 == fd)
while(1) //製作乙個迴圈用來讀取資料
if(!strncmp(buf,"bye",3)) //讀到bye結束(將buf中前三個字元和bye比較,一樣則返回0)
printf("read:%s\n",buf);
memset(buf,0,sizeof(buf)); //將buf中的內容初始化
} return 0;
}寫檔案:
#include #include #include #include#include#include#includeint main()
; fd = open("fifo.tmp",o_wronly); //以只寫的方式開啟檔案
if(-1 == fd)
while(1)
if(!strncmp(buf,"bye",3))
memset(buf,0,sizeof(buf));
} unlink("fifo.tmp");//刪除檔案,否則下次執行該程式會報錯,報錯型別為該檔案已存在
return 0;
}執行結果:
hello read:hello
wrold read:wrold
bye !
linux 程序通訊 管道通訊
程序通訊 1 pipe 函式的作用 建立無名管道 函式的原型 int pipe int fds 2 函式的引數 新建的兩個描述符fds陣列返回 fds 0 表示管道的讀取端 fds 1 表示管道的寫入端 返回值 成功 0 出錯 1 標頭檔案 include 2 mkfifo 函式的作用 建立有名管道...
linux程序通訊之管道
管道 可分為普通管道和命名管道。普通管道用於有親緣關係的程序間的通訊 父子程序 命名管道,通過給管道命名的方式,使得管道變成檔案系統中的管道檔案,從而允許無親緣關係的程序間通過訪問管道檔案進行通訊。管道是單向的,一端只能用於輸入,另一端只能用於輸出。管道是fifo的,即先進先出的,向管道中寫入的資料...
linux程序通訊 管道
管道分為有名管道和無名管道。無名管道 無名管道是半雙工的,就是對於乙個管道來講只能讀或者寫。就像高速公路一樣一條路只能單向行駛。建立無名管道的函式 所需要標頭檔案 include 函式原型 int pipe int fd 2 函式的返回值 失敗返回 1,成功返回0 乙個簡單的無名管道的例子 main...