关注this post我不明白Kaylum的回答。我有两个问题。
1)他/她想要使用变量" count"从fork中计算生成的进程总数(即子孙的总数等等+原始进程)。我看到S /他在父进程中将计数设置为1开始,这是有意义的(计算父进程)但是然后S /他在子进程中再次将count设置为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 :(得分:1)
我看到S /他通过在父进程中将count设置为1开始,这是有意义的(计算父进程)但是然后S /他在子进程中再次将count设置为1。为什么这有意义?计数已设置为1,这仅将计数设置为1。
否则,在循环中创建的每个子进程的count
值都可能大于1
。请记住fork()
从当前状态重复进程。因此,对于循环中的任何给定fork()
,count
不一定是1.如果您在count
部分中打印else
的值,则可以轻松理解这一点。
我一直在调查WEXITSTATUS,从我可以收集的内容中,它通过退出返回进程的退出状态。我的问题是我必须使用exit(0)或exit(1)吗?
这就是return(count)
的作用。从main返回相当于调用exit
,即exit(count);
。
请注意this answer将计数传递到exit()
状态。历史上exit status值限制为8位值。因此,对于大多数i
大于8的任何值,它可能无法正常工作
平台。