例項:
父程序生成子程序p1、p2,兩個子程序分別向管道寫入各自的字串,而父程序負責讀出它們。
)//lockf(fd[1],0,0); //解鎖
exit(0
);}else
//lockf(fd[1],0,0); //解鎖
exit(0
);}//father read
printf
("father read:\n");
for(i=
1;i<=
20;i++
)printf
("father read end.\n");
wait(0
);wait(0
);exit(0
);}}
/// lockf:
#inlude
intlockf
(int fd,
int cmd, off_t len)
-fd 是開啟檔案的檔案描述符。
為通過此函式呼叫建立鎖定,檔案描述符必須使用只寫許可權(o_wronly)或讀寫權
限(o_rdwr)開啟。如果呼叫程序是具有priv_lockrdonly 許可權的組的成員,它
也可以使用lockf
()來鎖定使用唯讀許可權(o_rdonly)開啟的檔案
-cmd 是指定要採取的操作的控制值,允許的值在中定義
如下所示:
# define f_ulock 0
//解鎖
# define f_lock 1
//互斥鎖定區域
# define f_tlock 2
//測試互斥鎖定區域
# define f_test 3
//測試區域
-len是要鎖定或解鎖的連續位元組數。
要鎖定的資源從檔案中當前偏移量開始,對於正 len 將向前擴充套件,對於負
len 則向後擴充套件(直到但不包括當前偏移量的前面的位元組數)。如果 len
為零,則鎖定從當前偏移量到檔案結尾的區域(即從當前偏移量到現有或任
何將來的檔案結束標誌)。要鎖定乙個區域,不需要將該區域分配到檔案
中,因為這樣的鎖定可以在檔案結束標誌之後存在。
-返回值
此函式呼叫成功後,將返回值 0,否則返回−1,並且設定 errno 以表示該錯
誤。 由於當檔案的某部分被其他程序鎖定後,變數 errno 將會設定為
[eagain]而不是[eacces],因此可移植應用程式應對這兩個值進行預計和
測試。先把lockf語句注釋掉,編譯執行程式的效果是兩個寫入程序寫入的資料會交叉寫入緩衝區
關於pipe管道的讀寫端關閉問題
通過pipe在核心中建立乙個檔案,然後可以實現兩個程序通訊 管道是一種最基本的ipc機制,由 pipe 函式建立 1 include 2 int pipe int filedes 2 呼叫 pipe 函式時在核心中開闢一塊緩衝區 稱為管道 用於通訊,它有乙個讀端乙個寫端,然後通過 filedes 引...
(P24)管道 管道的讀寫規則
當要寫入的資料量小於等於pipe buf,linux將保證寫入的原子性 原子性 假設a程序和b程序都要向管道寫入資料,a程序寫入的資料量小於等於pipe buf,則a程序寫入的資料是連續的,中間並不會插入b程序寫入的資料,man 7 pipe看pipe buf 否則多個程序往管道寫入資料,可能會出現...
Linux命名管道FIFO的讀寫規則
1.從fifo中讀取資料 約定 如果乙個程序為了從 fifo 中讀取資料而阻塞開啟了 fifo 那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。1 如果有程序寫開啟fifo,且當前fifo為空,則對於設定了阻塞標誌的讀操作來說,將一直阻塞下去,直到有資料可以讀時才繼續執行 對於沒有設定阻塞標誌的讀操...