多方讀寫管道的同步問題

2021-10-06 20:20:33 字數 1638 閱讀 9924

例項:

父程序生成子程序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為空,則對於設定了阻塞標誌的讀操作來說,將一直阻塞下去,直到有資料可以讀時才繼續執行 對於沒有設定阻塞標誌的讀操...