Im пытается создать многопроцессорную программу в c. основной процесс запустит 3 процесса, каждый из которых выполнит свою работу (спящий на 1-10 секунд) и сообщит, что он сделан. Проблема im сталкивается с тем, чтобы генерировать случайные числа. Я всегда получаю одинаковые числа (рандомизированный между каждым запуском, но постоянный между всеми разветвленными процессами. Является ли это ошибкой? (im new to 'c') Является ли это поведение разветвленного процесса? Если это так, как я могу сгенерировать случайные числаГенерировать случайные числа на разветвленных процессах в 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/
Дублированный [вопрос?] (Http://stackoverflow.com/questions/6161322/using-stdlibs-rand-from-multiple-threads) Принятый ответ говорит: «Функция« rand() 'не является реентерабельной или потокобезопасной». –
@weathervane, что вопрос о потоках. Это касается разветвленных процессов, которые не разделяют память. – rici
@Vane, спасибо за ваш ответ. его не о потоках, а о поведении процессов разветвления, которые имеют полный клон родительского процесса. – chenchuk