2014-11-08 52 views
0

學習關於與C.返回從子進程其用C父值與叉()

分叉我可以生成一個子過程與fork()好嗎創建。假設它執行一些計算。計算完成後,我希望它死亡並將結果(一些int)返回給父項。如何才能做到這一點?

通常我會發布我的進度代碼,但是這是從字面上它:

int main() { 
    pid_t pid = fork(); 
    if (pid == 0) { 
     // I'm a child! 
     int calculation = 10 + 10; 
     // <----- Return 20 to the parent? 
    }else{ 
     // I am the parent, and I am waiting to receive a 20 
    } 
    exit(0); 
} 
+0

有多種方式,你可以谷歌'IPC'(進程間通信)。 – SSC 2014-11-08 08:19:36

+0

挑剔的是,'fork'在C中不是標準的,而是在POSIX中。 – 2014-11-08 08:34:22

回答

1

你不能這樣做,因爲exit僅給出一個退出代碼(通常應該是成功EXIT_SUCCESS,並且只有7位)。並且退出代碼是過程返回的唯一東西(請參閱waitpid(2),爲避免zombie processes,您應該始終致電此退出代碼)。

你可以有父子進程使用一些共享內存和信號燈(見shm_overview(7) & sem_overview(7)),但這是複雜的,所以不適合你的情況。

最簡單的 - 和可能最快方法就是使用pipe(7) -S(要設立fork前),並且子進程打印其標準輸出對閱讀管與父進程管。請參閱pipe(2)以及popen(3)

您可能想要fork幾個(在桌面上最多打十幾個)並行進程。那麼你需要複用他們的管道輸入。爲此,請進行一些事件循環,並在父進程中使用poll(2)進行復用。

讀也Advanced Linux Programming

1

除了管和叉,最簡單的方法是使用POPEN()和讀在stdout兒童的響應作爲文件流。

你根本不必處理fork。 (雖然確實,popen是在fork和pipe以及dup2之上實現的)。

pclose()可用於檢查孩子的退出狀態。

+0

'pclose' *應該*用於'popen'(因爲它調用'waitpid')。 – 2014-11-08 08:48:10

+0

我的觀點是pclose _can_可以用來檢查退出狀態,但更多的時候它只能用於消防和忘記時尚。 – codenheim 2014-11-09 14:42:11

+0

順便說一下,在這種特殊情況下,'popen'不適用:OP是分叉的,但不是'執行'其他程序。 – 2014-11-09 15:19:07