UNPv2第四章 管道和FIFO

2021-07-11 11:21:58 字數 2437 閱讀 1371

所有式樣的unix都提供管道。它由pipe函式建立,提供單向資料流

#include

int pipe(int filedes[2]);

pipe()會建立管道,並將檔案描述詞由引數filedes陣列返回

filedes[0]為管道裡的讀取端

filedes[1]則為管道的寫入端

若成功則返回零,否則返回-1,錯誤原因存於errno中

例子:

main函式建立兩個管道並fork乙個子程序,客戶然後作為父程序執行,伺服器作為子程序執行。第乙個管道用於從客戶端向伺服器傳送路徑名,第二個管道用於從伺服器向客戶端傳送該檔案的內容

//返回:成功時為檔案指標,出錯時為null

int pclose (file * stream );

//返回:成功時為shell的終止狀態,出錯時為-1

type 引數只能是讀或者寫中的一種,得到的返回值(標準 i/o 流)也具有和 type 相應的唯讀或只寫型別。如果 type 是 「r」 則檔案指標連線到 command 的標準輸出;如果 type 是 「w」 則檔案指標連線到 command 的標準輸入。

command 引數是乙個指向以 null 結束的 shell 命令字串的指標。這行命令將被傳到 bin/sh 並使用-c 標誌,shell 將執行這個命令。

fifo由mkfifo函式建立

#include

#include

int mkfifo(const

char * pathname,mode_t mode);

//返回:成功為0,出錯為-1

其中pathname是乙個普通的unix路徑名。mode引數指定檔案許可權位

mkfifo函式已隱含指定o_creat|o_excl。也就是說,它要麼建立乙個新的fifo,要麼返回乙個eexist錯誤

管道和fifo的區別如下:

建立並開啟乙個管道只需要pipe,建立並開啟乙個fifo則需要呼叫mkfifo再呼叫open

管道在將它開啟著的程序中最後乙個關閉它之後自動消失,fifo的名字只有通過呼叫unlink才從檔案系統中刪除

fifo需要額外呼叫的好處是:fifo在檔案系統中有乙個名字,該名字允許某個程序建立乙個fifo,與它無親緣關係的另乙個程序卻開啟這個fifo。對於管道而言是不可能的

下面是管道或者fifo的讀出與寫入的若干額外規則:

(1)如果請求讀出的資料量多餘管道或者fifo的可用資料量,那麼只返回可用資料量

(2)如果請求的資料位元組小於等於pipe_buf,那麼write操作是原子的。

(3)o_nonblock標誌的設定對於write操作的原子性沒有影響——原子性完全由所請求的位元組數是否小於等於pipe_buf決定的。然而當乙個管道或fifo設定成非阻塞時,來自wirte的返回值取決於待寫的位元組數以及管道或fifo當前可用空間的大小。

如果待寫位元組數小於等於pipe_buf:

 (i)如果空間足夠則寫入

 (ii)如果空間不足,那麼立即返回eagain

如果待寫位元組數大於pipe_buf:

 (i)如果還有1位元組空間,那麼核心寫入該管道或fifo能容納數目的資料位元組,該數目同時作為來自write的返回值

 (ii)如果空間已滿,那麼立即返回eagain

如果寫入乙個沒有開啟著用於讀的管道或者fifo,那麼核心產生sigpipe訊號

有時候應用希望對所傳送的資料加上某種結構。當資料由變長訊息構成,並且讀出者必須知道這些訊息的邊界以判定何時已讀出單個訊息時,這種需求可能發生。下面三種技巧經常用於這個目的:

帶內特殊終止序列:許多unix應用程式使用換行符來分隔每個訊息。寫入程序給每個訊息新增乙個換行符,讀出程序每次讀出一行。

顯示長度:每個記錄前冠以它的長度。

每次連線乙個記錄:應用通過關閉與其對方的連線來指示乙個記錄的結束

系統加於管道和fifo的唯一限制為

open_max 乙個程序在任意時刻開啟的最大描述字數(至少16)

pipe_buf 可原子的寫往乙個管道或者fifo的最大資料量(至少512)

《APUE》第四章筆記(2)

下面介紹對stat結構的各個成員的操作函式。先貼個stat結構的圖 access函式 include int access const char pathname,int mode 其中,mode是表中的按位或。返回值 若成功返回0,若出錯返回 1 當程序對乙個檔案進行某種操作 讀或寫或執行 時,核...

C Primer Plus 隨記2(第四章)

1.宣告陣列 short months 12 訪問其元素 month 0 month 11 2.初始化陣列 1 int yam 3 列表初始化可省略等號,也可 不包含資料,元素均初始化為0 2 int xam 3 xam 0 20 xam 1 3 xam 2 5 xam 3 錯,不允許 xam ya...

第四章高階命令2

4.2.3 du 評估檔案大小利用率 du將1024位元組為單位顯示當前目錄的大小 du a 遞迴顯示目錄及目錄下的檔案大小 du h 以易讀形式顯示大小 4.2.4 cron crontab 執行計畫任務 守護程序是cron 命令 crontab etc init.d 目錄池 var spool ...