Unix程序與C程式設計 中篇

2021-04-16 22:58:09 字數 1298 閱讀 8768

3. 程序通訊——管道

unix

中的管道是一種先進先出

(fifo)

特殊檔案,這種檔案的大小是預定義的(版本相關),通常被定義為

10個邏輯塊,每個大小為

512位元組。在系統的

或中,包含乙個常量

pipe_buf

用來說明乙個管道緩衝區可以容納的最大位元組數。

管道是半雙工的,資料只能向乙個方向流動;需要雙方通訊時,需要建立起兩個管道。只能用於父子程序或者兄弟程序之間(具有親緣關係的程序);

管道對於管道兩端的程序而言,就是乙個檔案,但它不是普通的檔案,單獨構成一種檔案系統,並且只存在於記憶體中。

資料的讀出和寫入:乙個程序向管道中寫的內容被管道另一端的程序讀出。寫入的內容每次都新增在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出資料。

如果管道的寫端不存在,則認為已經讀到了資料的末尾,讀函式返回的讀出位元組數為

0。當管道的寫端存在時,如果請求的位元組數目大於

pipe_buf

,則返回管道中現有的資料位元組數,如果請求的位元組數目不大於

pipe_buf

,則返回管道中現有資料位元組數(此時,管道中資料量小於請求的資料量);或者返回請求的位元組數(此時,管道中資料量不小於請求的資料量)。 1)

示例程式如下(使用系統呼叫

pipe()

建立無名管道):

#include

#include

#include

main()else }

2)建立有名管道 a)

shell

命令:mknod pipename p b)

系統呼叫:

int mknod(const char *path, mode_t mode, dev_t dev);

c) 系統呼叫:

int mkfifo(const char *path, mode_t mode);

mkfifo()

會依引數

pathname

建立特殊的

fifo

檔案,該檔案必須不存在,而引數

mode

為該檔案的許可權,

mkfifo()

建立的fifo

檔案其他程序都可以用讀寫一般檔案的方式訪問。下面是

mkfifo()

的例子:

#include

#include

#include

main()else }

3)下面是乙個

server&client

通過管道通訊的例子(後篇)  

unix環境高階程式設計 程序環境與程序控制

a 終止 i.程序終止 1.正常終止 return exit exit 系a exit與 exit 的區別 exit退出時按 atexit 註冊的相反順序呼叫註冊過的函式,對開啟的流呼叫 fclose 將緩衝區的資料寫到檔案上 重新整理緩衝區 exit 沒有 b exit與自然返回 return 的...

unix 高階程式設計學習 程序

include fork 函式 1.建立返回0,則是當前子程序。2.建立返回大於0,則是父程序。3.如果建立出錯則是 1.include include includeint main void else if pid 0 else if pid 0 return 0 include include...

UNIX程式設計 13 守護程序

1.守護程序的程式設計規則 1 用umask將檔案模式建立遮蔽字設定為0 2 呼叫fork,然後使父程序退出 3 呼叫setsid建立乙個新會話 4 將當前工作目錄更改為根目錄 5 關閉不再需要的的檔案描述符 6 某些守護程序開啟 dev null使其具有檔案描述符0,1,2,例 初始化乙個守護程序...