2017-10-28 161 views
0

看着this post我不明白Kaylum的答案。我有两个问题。使用WEXITSTATUS从fork()调用中检索进程的总量

1)他/她希望使用变量“count”来计算产生的进程总数(即子孙孙等的总数+原始进程)。我看到,他/她通过在父进程中将count设置为1开始,这有意义(对父进行计数),但是然后S/he在子进程中再次将计数设置为1。为什么这有意义?计数已经设置为1,并且这只能再次设置计数等于1。

count += WEXITSTATUS(status); 

2)我一直在调查WEXITSTATUS,从我可以收集它通过退出返回进程的退出状态。我的问题是我必须用

exit(0) 

exit(1) 

或别的东西,为它工作。这方面的文件不清楚。换句话说它为Kaylum的

的完整代码段在这里工作的方便:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

int main(void) 
{ 
    pid_t before_pid, after_pid; 
    pid_t forked_pid; 
    int count; 
    int i; 
    int status; 

    before_pid = getpid(); 
    count = 1; /* count self */ 
    for (i = 0; i < 3; i++) { 
     forked_pid = fork(); 

     if (forked_pid > 0) { 
      waitpid(forked_pid, &status, 0); 
      /* parent process - count child and descendents */ 
      count += WEXITSTATUS(status); 
    } else { 
     /* Child process - init with self count */ 
     count = 1; 
    } 
} 

after_pid = getpid(); 
if (after_pid == before_pid) { 
    printf("%d processes created\n", count); 
} 

return (count); 
} 
+0

Kaylum的解决方案应该能够正常工作,但是它的数量限制在255:退出代码的最大值是255. – benjarobin

+0

谢谢。我现在明白了。我知道它限于255这很好。我很欣赏这些意见。 – EFiore

回答

1

我看到他/她在父进程这是有意义的设置数量为1开始了(来计算父母),但是然后他/她在孩子中再次设置为1。为什么这有意义?计数已经设置为1,并且这只能再次设置计数等于1。

否则,在循环中创建的每个子进程的值可能大于1count值。记住fork()重复从其当前状态的过程。因此,对于循环中的任何给定的fork()count不一定是1.如果在else部分中打印count的值,则可以轻松理解这一点。

我一直在调查WEXITSTATUS,从我可以收集它通过退出返回进程的退出状态。我的问题是我必须使用exit(0)还是exit(1)?

这就是return(count)从做的。从主返回相当于呼叫exit,即exit(count);

请注意,this answer通过exit()状态通过计数。 exit status值历史限制为8位值。因此,对于大多数 平台上的任何值i大于8,可能无法按预期工作。

+0

谢谢。我现在知道了。我很欣赏这些反馈。 – EFiore

+1

如果这个答案对你有帮助,[考虑接受它](https://meta.stackexchange.com/q/5234/362103)。祝你好运! – usr