
私に与えられる課題は、数字を分けることができるすべての数字(xと呼びましょう)をすべて見つけて、何回分けられるかを調べることです。
私フォークを使用する必要がありますタスクを実行します。
私が思いついたのは、数をxで割った回数を数える関数を書いてからforループで実行したところ、うまくいったということです。しかし、フォークを使って「並列化」したいです。可能ですか?
私の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 { ... }
includeが必要です<sys/wait.h>
。
最初のオプションは一時的に多数のゾンビを生成しますが、2番目のオプションは並列性を排除します。