fork()创建的进程不会并行执行
我在共享内存中获得了一个带有n个柱的整数矩阵,所以我创建了n个进程,每个进程创建一个柱的总和。问题是它们不能并行执行。还有就是代码(这实际上并没有做的总和,是测试):fork()创建的进程不会并行执行
int pid2[n];
i=0;
do{
pid2[i] = fork();
if(pid2[i]==-1) printf("fork() fail!\n");
else if(pid2[i]==0){
printf("Start process %d \n", i);
sleep((rand() % 50)/10);
printf("Process %d terminated" ,i);
}
else i++;
}
while(i<n&&pid2[i]>0);
什么,我得到的是,它在这个订单处理3,2,1运行,并以相同的顺序结束时,总是。但睡眠是随机的,所以到达时间应该是随机的!另外,我不明白为什么它从进程3开始。
你的代码是错误的,不这样做你的想法。
在fork()
成功的情况下,调用者递增i
,然后while的最终测试为false,因此原始进程终止。当新进程执行代码“start 0”,“terminate 0”时,然后跳转到真正的测试,然后再次分叉等等。所以你的进程总是以相同的顺序一个接一个地产生。
以下是更正代码(随机种子):
int pid2[n];
i=0;
do{
pid2[i] = fork();
if(pid2[i]==-1) printf("fork() fail!\n");
else if(pid2[i]==0){
printf("Start process %d \n", i);
sleep((rand() % 50)/10);
printf("Process %d terminated" ,i);
exit(0); // ends the child
}
else i++;
}
while(i<n&&pid2[i-1]>0); // test is last pid is correct
当您没有使用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;
}
我用srandom,仍然得到同样的数量。仍然我没有得到它为什么从过程3开始,而不是1. – alteration
@alteration:扩展我的答案 – nsilent22
父'仍然执行'while(我 0)''后'我'增加了这是错误的。 'pid [i]'在这一点上还没有初始化。 –
是的,我忘记纠正代码中的那一点...完成。 –