2015-02-08 100 views
0

嗨,我有一個簡單的問題,但時間問題困擾着我。假設這是代碼。父進程和子進程時間

#include <stdio.h> 

int main() { 
    int p = fork(); 
    if (p==0) { 
     printf("ok\n"); 
     sleep(1); 
    } else { 
     printf("hey!"); 
     sleep(1); 
    } 
    printf("done!"); 
    return 0; 
} 

我的問題是,將「完成!」當父母和孩子的睡眠時間爲1秒時,總是執行兩次。因爲我注意到當我在子進程中將睡眠增加到10秒(p == 0的情況)時,我只看到「完成!」一旦。

回答

3

我覺得當你增加睡眠時間父進程退出更快,標準輸出文件描述符關閉。請注意,子進程和父進程共享其文件描述符。

如果你想在你的父進程中使用_exit(),所以當它退出時,子進程文件描述符將不會被關閉。這樣在10秒後你會看到「完成!」在你的終端。要使用此方法,您必須使用printf("done!\n")來手動刷新緩衝區,因爲_exit()未刷新緩衝區。

如果你願意,你可以在你的父進程中使用類似wait()的東西來等待你的子進程。

+0

但是總是會在睡眠時打印兩次事件(1)? – 2015-02-08 04:59:19

+1

不,沒有保證,您需要等待()建議回答 – Kam 2015-02-08 05:00:17