为何fork创建的多进程打印相同时间?技术问询
为什么fork出的子进程会打印相同的时间戳?
我来帮你拆解这个问题,核心原因有两个,咱们一步步说:
1. 随机数生成的“重复陷阱”
你代码里的rand()没有初始化随机种子!默认情况下,rand()的初始种子是固定的数值1,而且当你用fork()创建子进程时,子进程会完整复制父进程的所有内存状态——包括rand()内部用来生成下一个随机数的状态变量。
这就导致所有子进程第一次调用rand()时,都会生成完全相同的数值,所以它们的sleep(rand()%15)时长是一模一样的。多个进程睡同样久,自然会几乎同时醒来结束,打印的时间戳当然相同。
2. time(NULL)的秒级精度(次要原因)
就算sleep时长有细微差异,time(NULL)返回的是当前时间的整秒数。如果多个进程在同一秒钟内结束,它们输出的时间戳也会是同一个值。不过在你的例子里,这个是次要因素,核心还是随机数重复的问题。
怎么修复?
解决办法很简单,让每个子进程拥有独立的随机种子就行。我们可以用子进程的PID(每个进程的PID都是唯一的)来初始化种子,修改后的代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <time.h> #include <sys/types.h> int main() { int x, i; for (i = 0; i < 9; i++) { x = fork(); if (x == 0) { // 用子进程独有的PID作为随机种子 srand(getpid()); sleep(rand() % 15); printf("%d ended: %ld\n", i, time(NULL)); exit(0); } } while (wait(NULL) != -1); exit(0); }
这样每个子进程的随机序列都是独立的,sleep时长会不一样,最终打印的结束时间戳也就各不相同了。
内容的提问来源于stack exchange,提问作者Arturo Vilela
相关产品推荐
相关产品推荐

