我一直无法弄清楚如何分叉多个(任何地方从10到200个)子进程,并让父进程等待所有这些进程完成。我试图对他们的累积执行时间进行基准测试。
尽管我付出了最大的努力,但是当我用顶部观看时,我已经得到了非常随机的结果和流程显示为“Z”(僵尸)。
我的代码如下,任何帮助将不胜感激。
int child_pid;
int status, wait_pid;
for(i = 0; i < instances; i++){
if((child_pid = fork()) < 0){ // an error occured
fprintf(stderr, "Fork failed\n");
exit(EXIT_FAILURE);
}
if(child_pid == 0){
// Child process --------------------------------------------------
fprintf(stdout, "Child with PID: %d is in if code.", getpid());
// Calculate pi using statistical methode across all iterations
for(i=0; i<iterations; i++){
x = (random() % (RADIUS * 2)) - RADIUS;
y = (random() % (RADIUS * 2)) - RADIUS;
if(zeroDist(x,y) < RADIUS){
inCircle++;
}
inSquare++;
}
/* Finish calculation */
pCircle = inCircle/inSquare;
piCalc = pCircle * 4.0;
/* Print result */
fprintf(stdout, "pi = %f\n", piCalc);
_Exit(EXIT_SUCCESS); //child is done ------------------------------
}
}
//Parent Process
while ((wait_pid = wait(&status)) > 0){
printf("Exit status of %d was %d \n", (int)wait_pid, status);
}
fprintf(stdout, "Bye from: %d.\n", getpid());
return 0;
编辑:
要测量我的结果,我只是使用Linux time命令从命令行调用该程序。
> /usr/bin/time ./pi-sched
EDIT2:
我的其余代码包含以下两个函数和一堆命令行解析和设置过程;没有其他与计算相关的东西。
inline double dist(double x0, double y0, double x1, double y1){
return sqrt(pow((x1-x0),2) + pow((y1-y0),2));
}
inline double zeroDist(double x, double y){
return dist(0, 0, x, y);
}
答案 0 :(得分:0)
当我用top观看时,进程显示为'Z'(僵尸)。
这是因为除非你完成for(i = 0; i < instances; i++){
循环,否则你不会开始等待子进程。要尽快等待子进程,您可以在waitpid(-1, &status, WNOHANG)
循环中将该调用发送到for()
,如果没有已终止的子进程,则此waitpid()
将立即返回。
我的结果非常随机
程序的执行时间取决于以下代码的成本:
x = (random() % (RADIUS * 2)) - RADIUS;
y = (random() % (RADIUS * 2)) - RADIUS;
if(zeroDist(x,y) < RADIUS){
inCircle++;
}
由于x
和y
是一些随机值,因此上述代码的执行时间也可能随机变化。