linux进程间通信-管道
生活随笔
收集整理的這篇文章主要介紹了
linux进程间通信-管道
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一?管道的局限性
????管道有兩個局限性:(1)他是半雙工(即數據只能在一個方向上流動)。(2)它只能在具有公共祖先的進程之間使用。一個管道由一個進程創建,然后該 進程調用fork,此后父子進程之間就可該管道。
?
二 管道的創建
? ?用函數pipe創建: #include<unistd.h> int pipe(int files[2]); 參數:filedes返回兩個文件描述符:filedes[0] 為從管道讀而打開,filedes[1]為管道寫而打開。filedes[1]的輸出是filedes[0]的輸入。三 管道原理圖
如下這張圖可以說明管道的原理,即一個父進程創建一個子進程后,父進程打開寫管道,子進程打開讀管道。四 管道只有一端時的情況
當管道的一端被關閉后,下列規則起作用: (1) ?當讀一個寫端已被關閉的管道時,在所有數據都被讀取后, read返回0,以指示達到了文件結束處(從技術方面考慮,管道的寫端還有進程時,就不會產生文件的結束。可以復制一個管道的描述符,使得有多個進程具有寫打開文件描述符。但是,通常一個管道只有一個讀進程,一個寫進程。下一節介紹F I F O時,我們會看到對于一個單一的FIFO常常有多個寫進程)。 (2) ?如果寫一個讀端已被關閉的管道,則產生信號 SIGPIPE。如果忽略該信號或者捕捉該信號并從其處理程序返回,則 write 出錯返回,errno設置為EPIPE。 (3) 在寫管道時,常數 PIPE_BUF 規定了內核中管道緩存器的大小。如果對管道進行 write調用,而且要求寫的字節數小于等于 PIPE_BUF,則此操作不會與其他進程對同一管道(或 FIFO )的write操作穿插進行。但是,若有多個進程同時寫一個管道(或?FIFO) ,而且某個或某些進程要求寫的字節數超過?PIPE_BUF字節數,則數據可能會與其他寫操作的數據相穿插。五 例子
#include <unistd.h> #include <stdio.h> #include <stdlib.h>#define MAXLINE (2014)int main(void) {int n, fd[2];pid_t pid;char line[MAXLINE];if (pipe(fd) < 0)printf("pipe error");if((pid = fork()) < 0)printf("fork error");else if (pid > 0) { /* parent */close(fd[0]);/* close read */printf ("the process pid %d\n", getpid());printf ("the process write to pipe : hello world!\n");write(fd[1], "hello world\n", 12);} else{ /* child */close(fd[1]); /* close write */printf("the process pid %d\n", getpid());n = read(fd[0], line, MAXLINE);write(STDOUT_FILENO, line, n);}exit(0); }?
轉載于:https://www.cnblogs.com/fangshenghui/p/4039833.html
總結
以上是生活随笔為你收集整理的linux进程间通信-管道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: syntax error: unexpe
- 下一篇: linux 其他常用命令