まず、rand()関数について多くの質問がありますが、これは異なると思います。C、rand関数がsleep()関数で正常に動作しない
実際には、sleep()関数と組み合わせていないときは、rand()関数が正常に動作します。私はそれを試してみました。しかし、この "sleep(rand()%5)"のようにrand()関数をsleep()関数と組み合わせると、すべての子プロセスにランダムな時間がかかることがありますが、最初の4-5人の子供、その後、残りのすべての子プロセスに対して0が生成されます。したがって、他の子プロセスは眠らない。そして時には、常にすべての子プロセスのための0を生成します。
私はUbuntu 64bitでコーディングしています。
私のコードについて: 私は親プロセスから8人の子供をフォークし、自分のPID番号を1つずつ出力したいと考えています。しかし、私は子供を作成した後にスリープ機能を使用する必要があります。睡眠時間はランダムでなければなりません。私はtime()関数をシードとして使用し、rand関数を使用しようとしましたが、スリープ関数では正しく機能しません。
は、ここに私のコードです:
#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);
}
"うまくいく"という意味を定義し、 "0"となることを意味します... "。 – Olaf
私は時々rand()の製品乱数を意味します。しかし時には製品は0だけです。今質問を編集します。 – Ayse
コードを適切に書式設定してインデントします。非プロトタイプの関数宣言子は、標準によって推奨されなくなりました。それらを使用しないでください。 – Olaf