gpt4 book ai didi

c - 在 c 中的 fork 进程上生成随机数

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:02 26 4
gpt4 key购买 nike

我正在尝试用 c 语言创建一个多进程程序。主进程将启动 3 个进程,每个进程都将完成其工作( sleep 1-10 秒)并报告他已完成。我面临的问题是关于生成随机数。我总是得到相同的数字(在每次运行之间随机化,但在所有 fork 进程之间保持不变。它是错误代码吗?(我是'c'的新手)它是 fork 进程的行为吗?如果是,我如何生成随机数?

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main(int argc, char **argv){
// srand(time(NULL));
printf("starting main proc [%d]\n", getpid());
// start 3 processes
for (int i=0; i<3; i++){
exec_waiting_proc(i);
}
return 0;
}
// sleeper process
int exec_waiting_proc(int id){
int pid;
pid = fork();
if (pid == 0){
// child
srand(time(NULL));
int parent_id = getppid();
int sleep_seconds = (rand() % 10) + 1;
printf("%d\n", sleep_seconds);
//sleep(r);
printf("child-%d [%d], done... my parent: [%d]\n", id, getpid(), parent_id);
_exit(0);
} else {
// parent
printf("parent [%d]: starting process %d\n", getpid(), pid);
}
return 0;
}

输出示例:(2 次)

chen ~/dev/c/geany/ ./ptr2 
starting main proc [25801]
parent [25801]: starting process 25802
parent [25801]: starting process 25803
8
child-0 [25802], done... my parent: [25801]
parent [25801]: starting process 25804
8
child-1 [25803], done... my parent: [25801]
8
child-2 [25804], done... my parent: [3077]
chen ~/dev/c/geany/
chen ~/dev/c/geany/
chen ~/dev/c/geany/ ./ptr2
starting main proc [25805]
parent [25805]: starting process 25806
parent [25805]: starting process 25807
parent [25805]: starting process 25808
7
child-0 [25806], done... my parent: [25805]
7
child-1 [25807], done... my parent: [25805]
7
child-2 [25808], done... my parent: [3077]
chen ~/dev/c/geany/

最佳答案

由于计算机运行速度非常快,time(NULL) 返回的值将(更可能)对于每个进程都是相同的。尝试

time(NULL) ^ getpid()

改为初始化随机数生成器。

其他选项包括使用以纳秒为单位的时间

关于c - 在 c 中的 fork 进程上生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41751193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com