【发布时间】:2016-07-13 19:28:42
【问题描述】:
首先,我知道有很多关于 rand() 函数的问题,但我认为这是不同的。
实际上,当我没有与 sleep() 函数结合时,rand() 函数总是可以正常工作。我尝试过这个。但是当我像这样“sleep(rand() %5)”将 rand() 函数与 sleep() 结合使用时,有时它会为所有子进程产生随机时间,如我所料,但有时对前 4-5 个孩子效果很好,之后,它为所有剩余的子进程生成 0。所以其他子进程不会休眠。有时它总是为所有子进程生成 0。
顺便说一句,我在 Ubuntu 64 位上编码。
关于我的代码: 我想从父进程中分叉 8 个子进程并一一打印他们的 pid 号。但是我应该在创建一个孩子后使用睡眠功能。睡眠时间应该是随机的。我使用 time() 函数作为种子并尝试使用 rand 函数,但它不能与 sleep 函数一起正常工作。
这是我的代码:
#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...”的含义。 -
我的意思是有时 rand() 产品随机数,正如我所料。但有时它只产生 0。我现在将编辑问题。
-
正确格式化和缩进你的代码。并且标准不推荐使用非原型函数声明符。不要使用它们。
-
从当前时间播种随机数生成器永远不会正确。你能说的最好的就是偶尔它是无害的。
-
@rici 我应该用什么来代替时间作为种子?你有什么建议?