我试图从父母创建4个子进程,让每个孩子执行不同的事情。
int main(void) {
int processes = 4;
int i;
for (i = 1; i <= processes; i++) {
if (fork() == 0) {
printf("pid: %d\n", getpid());
exit(0);
}
}
int status;
for (i = 1; i <= processes; i++)
wait(&status);
}
现在输出产生了 pid:5847 pid:5846 pid:5845 pid:5844
为什么pid会减少而不是增加订单?我没有正确使用fork()创建子项吗?
答案 0 :(得分:0)
这是一种视错觉。 PID按顺序递增;)让我解释一下:
您无法控制调度程序首先选择哪个进程。但是,如果您在sleep(1);
循环的末尾添加for
,我确定PID将按递增顺序排列(除非您达到上限并且它们会回绕。)
至少Linux和OS X按顺序生成PID,不了解其他类Unix操作系统。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int processes = 4;
int i;
int fork_result;
int number_of_children;
for (i = 1; i <= processes; i++) {
fork_result = fork();
if (fork_result > 0) {
printf("parent says: hello child #%d, how are you?\n", fork_result);
number_of_children++;
} else if (fork_result == 0) {
printf("pid: %d\n", getpid());
exit(0);
} else if (fork_result < 0) {
printf("parent says: fork() failed\n");
}
}
int status;
for (i = 1; i <= number_of_children; i++) {
wait(&status);
}
}
在我的系统(OS X 10.10.5)上打印:
parent says: hello child #2577, how are you?
parent says: hello child #2578, how are you?
pid: 2577
pid: 2578
parent says: hello child #2579, how are you?
parent says: hello child #2580, how are you?
pid: 2579
pid: 2580
您使用的操作系统是什么? &#34;父母说:&#34;在任何情况下,行都应按递增顺序排列。