You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:25:46