交给我的任务是我必须找到所有能整除一个数字(我们称之为x)的数字,并找出它能整除它多少次。
我必须使用叉子做任务。
我想到的是,我编写了一个函数来计算一个数字除以 x 的次数,然后我在 for 循环中运行它,它工作得很好。不过我想用 fork 来“并行化”它。是否可以?
我的 C 函数看起来像这样
int check_dividers(int *x, int i)
{
int c = 0;
if (*x % i == 0)
{
do
{
c++;
*x = *x / i;
} while (*x % i == 0);
}
return c;
}
我尝试生成一个新进程来执行每个计算并将其写入输出文件,但它只是变得混乱。
int i = 2;
while (i < x && x != 0)
{
if (x % i == 0)
{
pid_t pid;
if ((pid = fork()) < 0)
{
perror("error during fork");
exit(0);
}
else
{
if (pid == 0)
{
int num_dividers = check_dividers(&x, i);
fprintf(out, "%d: %d\n", i, num_dividers);
fflush(out);
}
}
}
i++;
}
如果 x = 315,我的输出
3: 2
5: 1
7: 1
21: 1
9: 1
5: 1
15: 1
9: 1
7: 1
63: 1
7: 1
105: 1
15: 1
9: 1
35: 1
45: 1
21: 1
答案1
发生的情况是子进程在任务完成后不会退出。所有进程都将运行自己的外循环实例。
你需要exit(0)
冲洗一下。
你也应该wait
为了孩子。
您可以在 (1) 最后使用while (wait(NULL) != -1);
或 (2) 在每个过程之后使用waitpid(pid, NULL, 0);
after if ((pid = fork()) < 0) { ... } else { ... }
You'll need include 来执行此操作<sys/wait.h>
。
第一个选项会暂时导致大量僵尸,但第二个选项会消除并行性。