ループ内に 4 つの子プロセスを作成する C プログラム (FreeBSD、Unix 用) を作成しようとしています。それぞれの子供は何かをし、死ぬとすぐに他の子供に取って代わられます。というわけで、4人の子供がずっと働いています。
各子 PID をテーブルに登録する必要があり、それらが終了した後、テーブルの PID を削除する必要があります。これは私が問題を抱えている部分です。
したがって、最初の試行では、死んだ子の PID をグローバル変数に送信するハンドラーを作成しようとしました。
int global_variable;
void handler_SIGCHLD(int sig)
{
pid_t son;
int e;
do {
son = wait3(&e, WNOHANG, NULL);
if ((son > (pid_t)0) && (WIFEXITED(e) || WIFSIGNALED(e)))
{
global_variable = son;
}
} while (son > (pid_t)0);
}
次に、親でそれを使用して、死んだ子の PID をテーブルから削除します。しかし、2 人の子供が同時に死亡した場合、PID の 1 つが別の PID によって上書きされることに気付きました。
どうすればこの状況を回避できますか?