2012-07-08 133 views
1

当彻底fork()命令时,我碰到一个问题。叉()命令问题

第12秒结束时创建了多少个进程,如果 时间从0秒开始?进程id的开始从0

伪代码

while(true) 
     { 
      sleep 1second; 
      if(getpid() % 2 == 0) 
      { 
        fork(); 
        printf("Hello\n"); 
      } 
     } 

当我在我的系统上面的代码运行它没有显示在输出的konsole。没有 。在12秒的结束过程依赖于OS需要的建议,因为我不是在叉好()

+0

'getpid()'不是一个进程计数器。 pid可以(并且应该,即使它们通常不是)以随机顺序分配。这个项目的输出结果没有什么可说的。 – 2012-07-08 20:30:12

回答

1

printf后补充一点:?

fflush(stdout); 

但你必须用你的逻辑的一个基本问题。 fork()在孩子中返回0,并且父亲中的孩子pid。你不检查,所以父母和孩子都继续循环,这会再次发生,并且一次又一次地永远发生。您需要将循环体更改为:

if(fork() == 0) 
{ 
    printf("Hello!\n"); 
    fflush(stdout); 
} 
+0

是啊!现在它的印刷,但无限循环。这意味着不。 12秒后的过程是无限的,听起来很奇怪,或者我误解了某些东西? – 2012-07-08 18:52:30

+0

@sharaddixit:你的循环永远不会结束。如果你只希望它持续~12秒,用for循环代替这个形式:'for(int i = 0; i <12; i ++)'。 – Linuxios 2012-07-08 18:54:29

+0

即使这样,它既不会显示任何东西,也不会打印无限的问候。即使有限的循环,为什么不是有限的“你好”? – 2012-07-08 19:00:23

2

从何时开始进程ID“从0开始”?即使系统启动时也没有;第一个过程的ID为1 :-)

只有当你自己的进程ID是偶数时才是fork();所以如果它碰巧是奇怪的,那么什么都不会发生......这意味着如果你多次运行该程序,有时它会做某件事,有时它不会。