簡體   English   中英

C語言中的管道-我必須使用fork嗎?

[英]Pipelines in C - Do I have to use fork?

假設我在Linux環境中僅使用C。

通常,如果要使用pipe()函數,則可以創建一個管道,然后對其進行分叉,從而允許父級與子級進行通信,反之亦然。

但是如果不是父母和孩子怎么辦? 如果我有一個正在運行的舊進程,是否可以使用pipe()函數與之通信? 這個過程不是我當前過程的父級(或以任何方式與其關聯),但是我很生氣。 我是否只能使用文件或套接字進行進程間通信?

我有什么辦法可以指定一個pid並從中接收信息而無需使用套接字?

或使用fifo(7) -s(又名命名管道) ,或使用unix(7)套接字; 另請閱讀高級Linux編程以獲得更多可能性。 另請參見intro(2)syscalls(2)

您還可以使用一些共享內存和信號量,請參見shm_overview(7)sem_overview(7) ,或者(如RADAR所述 )消息隊列,請參見mq_overview(7) 但是,對IPC使用signal(7) -s通常不是一個好主意。

請注意, 處理器間通信通常需要兩個過程的合作和修改; 換句話說,您可能應該同時更改舊的A和啟動B的代碼! 而且您可能不希望進程A未經同意就泄漏信息。

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

另請閱讀proc(5) ; 通過/proc/1234/您可以查詢有關進程1234的一些信息。

順便說一句,盡管確實在調用父進程和子進程之間的fork(2)之前,經常會設置好pipe(7) -s(使用pipe(2) ),但這不是必須的。 特別是在某些情況下,您希望進程通過管道傳遞給自身(例如,用於Qt中的Unix信號傳遞 )。

對於你的問題

但是如果不是父母和孩子怎么辦? 如果我有一個正在運行的舊進程,是否可以使用pipe()函數與之通信?

您將無法與父進程未創建的任何其他進程進行通信。 從技術上講,不應該允許您這樣做。

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

正是由於這個主要原因,數據庫才被廣泛使用。 多個進程將能夠讀取數據並將數據寫入單個DB。 具有多重更新保護。

暫無
暫無

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

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