當您沒有使用srandom
函數種子隨機數生成器時,您將始終獲得相同序列的「隨機」數字。通常你會撥打srandom(time(NULL))
。
檢查這個簡單的程序:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%d\n", rand());
return 0;
}
在我的電腦總是輸出1804289383
。
此外,當您在您的孩子的過程稱之爲rand
它總是繼承隨機數生成機器的父母的狀態,讓您的孩子將永遠產生的相同隨機數。在分叉之前你應該產生這個隨機數。在下面的代碼的所有兒童返回相同的隨機值:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#define CHILDREN 3
int main(void) {
int i;
for (i = 0; i < CHILDREN; ++i) {
if (fork() == 0) {
printf("rand is %d in child %d\n", rand(), i);
return 0;
}
wait(NULL);
}
return 0;
}
最後一件事是,創造一些工藝單後,另一個並不意味着他們將得到的處理器時間的順序。當你的第一個孩子fork
完全沒問題時,處理器的上下文將返回給父母,他將執行另一個fork
,然後處理器的上下文將被分配給第二個孩子,而不是第一個孩子。
的作品
代碼:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#define CHILDREN 3
int main(void) {
int pid, i, children = 0;
srand(time(NULL));
double sleeptime;
for (i = 0; i < CHILDREN; ++i) {
sleeptime = (rand() % 50)/10.0;
pid = fork();
if (pid == -1) {
perror("fork failed");
} else if (pid == 0) {
printf("Child %d crated\n", i);
fflush(stdout);
sleep(sleeptime);
printf("Child %d terminated\n", i);
fflush(stdout);
return 0;
} else {
++children;
}
}
// wait for all childredn
for (i = 0; i < children; ++i) {
wait(NULL);
}
return 0;
}
父'仍然執行'while(我 0)''後'我'增加了這是錯誤的。 'pid [i]'在這一點上還沒有初始化。 –
是的,我忘記糾正代碼中的那一點...完成。 –