当您没有使用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]'在这一点上还没有初始化。 –
是的,我忘记纠正代码中的那一点...完成。 –