簡體   English   中英

如何通過多個讀取過程鎖定PIPE(或FIFO)?

[英]How to lock a PIPE (or FIFO) with multiple reading processes?

這是場景,我的父進程有一個范圍(a,b)和一個NI想要計算(a,b)之間所有素數的數字。 但是處理部分由N個子進程完成。

因此,我創建了一個管道,然后將范圍划分為N個部分。(a1,b1)...(an,bn)然后創建了N個子進程,然后在父級中將每個范圍依次寫入寫端。

問題來了,如果只有一個子過程,我可以遵循這個答案 如果有多個進程試圖寫入管道,則答案是可以接受的。 但是這里有多個進程正試圖讀取,而一個進程正試圖從管道中讀取,因此應該正好一個接一個地讀取兩個整數,因此這部分應該是原子的。 也許我可以嘗試使用互斥鎖,但是不知道如何在進程間使用互斥鎖。如何實現?

如何通過多個讀取過程鎖定PIPE(或FIFO)?

您可以在管道描述符上使用文件鎖:

  • flock(2) (在POSIX中指定);
  • POSIX記錄鎖定,請參見fcntl(2) “咨詢記錄鎖定”部分以及lockf(3)包裝器(均在POSIX中指定);
  • 打開文件描述鎖,請參閱fcntl(2) (特定於Linux,在最新內核中可用)。

您也可以使用POSIX信號量或其他IPC,但是隨后需要單獨的文件描述符。


但是,在您的情況下,您實際上並不需要這樣做,因為您可以在一個調用中寫入和讀取兩個整數這將是原子的,如注釋中所述。

如果緩沖區大小不大於PIPE_BUF則寫入和讀取在管道上是原子的。 參見write(2)

嘗試寫入管道或FIFO具有幾個主要特征:

  • 原子/非原子:如果一個操作中寫入的總量未與任何其他進程的數據交錯,則寫入是原子的。 當有多個作者將數據發送到單個讀者時,此功能很有用。 應用程序需要知道可以自動執行多大的寫請求。 此最大值稱為{PIPE_BUF}。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM