2014-11-04 56 views
1

讓我們假設我只在C環境下工作。C中的管道 - 我必須使用fork嗎?

通常,如果你想使用管道()函數,你可以創建一個管道,然後叉它,從而使父母與孩子溝通,反之亦然。

但是,如果它不是父母和孩子呢?如果我有一個正在運行的舊進程,是否可以使用pipe()函數與它進行通信?這個過程並不是我當前過程的父親(或任何相關的),但我有它的PID。我是否限於文件或套接字進行進程間通信?

有沒有什麼方法可以讓我有可能指定PID和接收來自它的信息,而無需使用插座?

+0

使用消息隊列 – radar 2014-11-04 05:20:49

+0

你的問題太廣,你不解釋一下這兩個過程做!請*編輯您的問題*以改善它! – 2014-11-04 06:05:29

回答

1

或者使用fifo(7) -s,又名命名管道,或使用unix(7)插座;也讀Advanced Linux Programming以獲得更多的可能性。又見intro(2) & syscalls(2)

你也可以使用一些共享內存和信號燈,看到shm_overview(7) & sem_overview(7),或消息隊列(如RADAR評論),見mq_overview(7)。但使用signal(7) -s用於IPC通常是一個壞主意。

注意inter-processor communication通常需要兩個過程的合作和修改;換句話說,你可能應該改變你的老B的程序代碼!而且您可能不希望流程A在未經同意的情況下泄漏信息。

順便說一句,你還可以使用mmap(2)例如共享內存在一個共同的文件上。但你需要一些同步。

又讀proc(5);直通/proc/1234/您可以查詢有關流程1234

BTW一些​​信息,而事實上pipe(7) -s呼籲父子進程並非是強制性之間fork(2)之前經常設置(使用pipe(2))。特別是,有些情況下您想要一個進程自行管理(例如,對於Unix signal delivery in Qt)。

1

您的問題

但是,如果這不是一個家長和孩子呢?如果我有一個正在運行的舊進程 ,是否可以使用管道() 函數與它進行通信?

您將無法與任何其他過程,這不是由父進程創建的通信。從技術上講,你不應該被允許。

你需要通過OS或使用其他IPC機制實現此功能。

由於這個主要原因,數據庫被廣泛使用。多個進程將能夠讀寫數據到單個數據庫。保護多個更新。