在c中生成分叉进程的随机数

时间:2017-01-19 20:34:51

标签: c random process fork

我试图在c中创建一个多进程程序。主要过程将启动3个过程,每个过程都会完成其工作(睡眠1-10秒)并报告他已完成。 我面临的问题是关于生成随机数。我总是得到相同的数字(在每次运行之间随机化,但在所有分叉进程之间保持不变。它是一个有缺陷的代码吗?(我对'c'是新的)它是分叉进程的行为吗?如果是,我怎么能生成随机数?

#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/ 

1 个答案:

答案 0 :(得分:3)

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

time(NULL) ^ getpid()

初始化随机数生成器。

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