2015-02-08 101 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