Ich versuche, ein Multiprocess-Programm in c zu erstellen. Der Hauptprozess startet 3 Prozesse, jeder wird seinen Job machen (Schlaf für 1-10 Sekunden) und wird berichten, dass er fertig ist. Das Problem besteht darin, die Zufallszahlen zu generieren. Ich habe die gleichen Zahlen immer (randomisiert zwischen jedem laufenden, aber konstant zwischen allen gegabelten Prozessen. Ist es ein fehlerhafter Code? (im neu zu 'c') Ist es das Verhalten eines gegabelten Prozesses? Wenn es ist, wie kann ich erzeugen ZufallszahlenGenerieren Sie zufällige Zahlen auf verzweigten Prozessen in 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;
}
Ausgabebeispiel: (2-mal)
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/
Duplizieren [Frage?] (Http://stackoverflow.com/questions/6161322/using-stdlibs-rand-from-multiple-threads) Die akzeptierten Die Antwort lautet: "Die Funktion' rand() 'ist nicht reentrant oder Thread-sicher." –
@weathervane diese Frage betrifft Threads. In diesem Fall handelt es sich um gegabelte Prozesse, die keinen Speicher teilen. – rici
@Vane, danke für deine Antwort. Es handelt sich nicht um Threads, sondern um das Verhalten von Forking-Prozessen, bei denen der Elternprozess vollständig geklont wird. – chenchuk