2017-01-19 2 views
0

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/ 
+0

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." –

+1

@weathervane diese Frage betrifft Threads. In diesem Fall handelt es sich um gegabelte Prozesse, die keinen Speicher teilen. – rici

+0

@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

Antwort

2

Da Computer von time(NULL) der Wert zurückgegeben schrecklich schnell laufen wird sich (mehr oder wahrscheinlich) für jeden Prozess gleich sein Versuchen.

time(NULL)^getpid() 

, um stattdessen den Zufallszahlengenerator zu initialisieren.

Weitere Optionen sind die Zeit in Nanosekunden gemessen

+0

/dev/urandom ist auch eine gute Option, wenn Sie es haben. – rici

+0

@Ed, dann für Ihre Antwort. Kannst du die Formel erklären? bedeutet es etwas in der Macht der PID? was bedeutet, dass Sie sich auf die PID selbst als Ausgangspunkt für die Randomisierung verlassen? – chenchuk

Verwandte Themen