管道是unix 系統中比較古老的一種,他有兩個比較大的侷限性(缺點)。
(1)歷史上的通道都是半雙工的(即資料只能往乙個方向流)。某些系統是全雙工的,但是由於大多數系統都是半雙工的,為了提高可移植性,應該將通道視作半雙工去使用。
(2)管道的只能使用在有公共祖先的程序之間。一般情況下,乙個程序由程序建立,在呼叫fork之後,這個管道就能在父子程序之間使用了。
雖然有以上的兩大缺點,但是管道依然是unix中最常用的乙個命令。在shell命令中的 「 | 」,就是乙個管道。每當使用「 | 」時,shell 會為其命一條命令建立乙個程序,然後將管道前一條命令的標準輸出與後一條命令的標準輸入相連線。
shell中管道的具體使用
1、管道的建立
fd[0]為讀而開啟,fd[1] 為寫而開啟。fd[1]的輸出是fd[0]的輸入。
2、管道的通訊
(1)父程序建立管道,得到兩個⽂件描述符指向管道的兩端
(2)父程序fork出子程序,⼦程序也有兩個⽂件描述符指向同⼀管道。
(3)父程序關閉fd[0],子程序關閉fd[1],即⽗程序關閉管道讀端,⼦程序關閉管道寫端(因為管道只支援單向通訊)。⽗程序可以往管道⾥寫,⼦程序可以從管道⾥讀,管道是⽤環形佇列實現的,資料從寫端流⼊從讀端流出,這樣就實現了程序間通訊。
3、書中**的實現,實現的父程序寫,子程序讀的乙個管道實現。
#include "apue.h"4、管道讀資料會有四種情況(1)讀端不讀,寫端一直寫intmain(void)
else if (pid > 0) else
exit(0);
}
(2)寫端不寫,讀端一直讀
(3)讀端一直讀,寫端關閉
(4)寫端一直寫,讀端關閉
5、書中介紹了乙個例項,將乙個檔案的內容,分頁顯示出來,**如下:
#include "apue.h"部分參考:linux程序間通訊-管道深入理解 (個人感覺在程序間通訊方面,總結的不錯,值得參考)#include
#define def_pager "/bin/more" /* default pager program */
intmain(int argc, char *ar**)
else if (pid > 0)
if (ferror(fp))
err_sys("fgets error");
close(fd[1]); /* close write end of pipe for reader */
if (waitpid(pid, null, 0) < 0)
err_sys("waitpid error");
exit(0);
}else
/* get arguments for execl() */
if ((pager = getenv("pager")) == null)
pager = def_pager;
if ((ar**0 = strrchr(pager, '/')) != null)
ar**0++; /* step past rightmost slash */
else
ar**0 = pager; /* no slash in pager */
if (execl(pager, ar**0, (char *)0) < 0)
err_sys("execl error for %s", pager);
}exit(0);
}
unix環境高階程式設計 程序間通訊(2)
函式popen和pclose 常見的操作是建立乙個連線到另乙個程序的管道,然後讀其輸出或向其輸入端傳送資料,這兩個函式實現的操作是 建立乙個管道,fork乙個子程序,關閉未使用的管道端,執行乙個shell執行命令,然後等待命令終止。函式popen執行fork,呼叫exec執行cmdstring,返回...
《UNIX環境高階程式設計》十七高階程序間通訊讀書筆記
unix域套接字用於在同一臺計算機上執行的程序之間的通訊。unix域套接字提供流和資料報兩種介面。unix域資料報服務是可靠的,既不會丟失報文也不會傳遞出錯。使用socketpair函式來建立一對無命名的 相互連線的unix域套接字。include int socketpair int domain...
Unix程序間通訊程式設計經驗總結
1.非阻塞socket 網路上程序通訊方法。1 使用描述 socket建立時使用fcntl設定o nonblock標誌,判斷連線成功需要在connect後呼叫一下select看埠是否可以讀寫。讀 寫socket前需用select判斷,如果讀 寫不到資料 read write返回0 則認為出錯 2 訊...