Zunächst einmal weiß ich, es gibt eine Menge Fragen über rand() Funktion, aber ich denke, das ist anders.C, rand funktioniert nicht richtig mit sleep() Funktion
Eigentlich funktioniert die Funktion rand() immer richtig, wenn ich nicht mit der Funktion sleep() kombiniert habe. Ich versuchte es. Aber wenn ich die Funktion rand() mit sleep() wie dieser "sleep (rand()% 5) kombiniere", ist es manchmal zufällige Zeit für alle Kindprozesse, wie ich es erwartet habe, aber manchmal funktioniert es gut für die ersten 4-5 Kinder. Danach wird 0 für alle verbleibenden untergeordneten Prozesse erstellt. So schlafen andere Kinderprozesse nicht. Und manchmal gibt es immer Produkte 0 für alle Kindprozesse.
BTW, ich codiere auf Ubuntu 64bit.
Über meinen Code: Ich möchte 8 Kinder vom Elternprozess abzweigen und ihre pid Zahlen eins nach dem anderen drucken. Aber ich sollte die Schlaffunktion nach dem Erstellen eines Kindes verwenden. Die Schlafzeit sollte zufällig sein. Ich habe die time() -Funktion als Seed verwendet und versuche die Rand-Funktion zu verwenden, aber sie funktioniert nicht richtig mit der Sleep-Funktion.
Hier ist mein Code:
#include <stdio.h>
#include <sys/sem.h>
#include <unistd.h>
#include <wait.h>
#include <stdlib.h>
#include <time.h>
void childs();
void parent();
int id;
int i;
int pidID[9];
int fd[2];
char buff[100];
int main(int argc, char *argv[]){
pid_t child;
for(i = 0; i < 8; i++){
pipe(fd);
child = fork();
wait(NULL);
if(child){
parent();
continue;
}else if(child == 0){
childs();
break;
}else{
perror("State\n");
exit(1);
}
}
if(child ==0){
printf("I am a child pid: %d, ppid: %d pidno: %d\n", getpid(), getppid(),pidID[i+1]);
}else{
printf("I am a parent pid: %d, ppid: %d pidno: %d\n", getpid(), getppid(),pidID[0]);
}
}
void childs(){
id = getpid();
pidID[i + 1] = id;
char swap[50];
sprintf(swap, "%d" ,id);
write(fd[1], swap, 10);
srand(time(NULL));
int randomTime = rand() %5;
printf("Random time: %d\n",randomTime);
sleep(randomTime);
}
void parent(){
pidID[0] = getpid();
read(fd[0], buff , 10);
printf("Buff: %s\n", buff);
}
Definieren Sie, was Sie mit "funktioniert gut" und was Sie meinen mit "wird' 0 "... gemeint. – Olaf
Ich meine manchmal rand() Produkte Zufallszahlen, wie ich erwartet habe. Aber manchmal sind es nur Produkte 0. Ich werde jetzt die Frage bearbeiten. – Ayse
Formatieren Sie Ihren Code und ziehen Sie ihn richtig ein. Und Nicht-Prototyp-Funktionsdeklaratoren werden vom Standard nicht mehr unterstützt. Benutze sie nicht. – Olaf