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,例 初始化乙個守護程序...