2013-01-18 102 views
0

我正在使用共享內存實現管道。 我應該只寫和觸摸庫,而不是main()使用共享內存實現管道

我遇到一個問題:

比方說這是誰用我的圖書館shared_memory_pipe.h一些用戶的main()

#include "shared_memory_pipe.h" 

int main() { 
    int fd[2]; 
    shared_memory_pipe(fd); 
    if (fork()) { 
     while(1) {} 
    } 
    shared_memory_close(fd[0]); 
    shared_memory_close(fd[1]); 
} 

在這個例子中我們可以看到,孩子將關閉這兩個他FD的,但父親陷入無限循環,永遠不會關閉他的fd。在這種情況下,我的管道應該仍然存在(與所有寫入fd都關閉的情況相比,或者所有讀取fd都關閉,或者全部關閉,所以管道應該死亡)。

正如我之前所說,我只寫了庫(shared_memory_pipe.h)。 那麼,在圖書館裏,我怎麼知道fork()已經被製作了?

我怎麼知道還有另一個進程對我的共享內存管道有讀/寫結束,所以我知道要關閉/不關閉我的共享內存管道?

我聽說有人知道有一個fork()或類似的命令,但我沒有找到它,我不知道它。

謝謝! 請詢問您是否需要更多信息。

回答

0

在任何分支之前父母可以將getpid()的結果存儲到全局pid_t pid_parent

比在稍後的時間點進程cann測試pid_parent再次使用getpid()

如果比getpid()的結果不同於pid_parent該進程至少有一個fork()遠離父進程。

+0

我不明白, 我不寫'main()',我不能那樣做。如果我在圖書館那樣做,那麼在某些情況下,孩子可能永遠不會使用圖書館的任何功能,所以我永遠無法知道他的pid – hudac

0

哪部分代碼負責關閉fd?

如果是用戶代碼,那麼fork()不是你的問題。畢竟,調用者可以爲一個不同的程序執行execve(匿名管道的常見用法),所以即使fd仍處於打開狀態,您的庫代碼現在已經從流程中消失了,因此您無法處理該問題。

如果你有一個庫API來關閉FD,那麼這就是你所能做的。無論如何,執行程序不會調用您的程序庫。

+0

我只是編輯了我的問題,因爲我沒有寫出「 close()'correct,'main()'應該關閉共享內存管道,完全像一個真正的管道,在'pipe(fd)'之後,你應該執行'close(fd [0])''close(fd1 [1])' – hudac

+0

@hudac:好的,如果主要責任關閉fd,而不是圖書館,那麼當他們沒有正確關閉fd時,你的責任如何?例如,他們可以關閉一個fd而不關閉另一個。 – cdarke

+0

這是正確的,用戶可以做他想做的任何事情......問題是:如何跟蹤開放的FD?我怎麼知道,例如,如果所有進程都關閉了他們的特定fd的寫作方?因爲如果所有進程關閉了他們的特定fd的寫入端,那麼,作爲一個普通管道,我應該刪除管道,不是嗎? – hudac