UNIX高階程式設計總結 程序間通訊(管道)

2021-09-22 19:47:47 字數 2364 閱讀 6627

管道是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"

intmain(void)

else if (pid > 0) else

exit(0);

}

4、管道讀資料會有四種情況(1)讀端不讀,寫端一直寫

(2)寫端不寫,讀端一直讀

(3)讀端一直讀,寫端關閉

(4)寫端一直寫,讀端關閉

5、書中介紹了乙個例項,將乙個檔案的內容,分頁顯示出來,**如下:

#include "apue.h"

#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);

}

部分參考:linux程序間通訊-管道深入理解  (個人感覺在程序間通訊方面,總結的不錯,值得參考)

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 訊...