1

一度に複数の子プロセスを起動し、システム時間とユーザー時間を記録する必要があるシェルを作成しています。

これまでのところ、私はそれを行うことができます。唯一の問題は、wait4 を使用して、子プログラムが使用するシステム リソースを取得し、それを使用法と呼ばれる私の rusage 構造に入れていることです。

すべてのプロセスを同時に起動し、ユーザーとシステムの時刻を追跡するにはどうすればよいですか? wait4() システム コールを削除し、外部でループして親を待機させることができますが、そうすると、すべてではなく最後のプロセスの時間しか記録できません。

どうすればこれを修正できるか分かりますか?

execute(commandPipev,"STANDARD",0);
wait4(pid,&status,0,&usage);
printf("Child process: %s\t PID:%d\n", commandPipev[0], pid);
printf("System time: %ld.%06ld sec\n",usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
printf("User time:   %ld.%06ld sec\n\n",usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);
4

1 に答える 1

2

複雑な答え。

POSIX 環境では、子を起動waitid()し、オプションを使用してWNOWAIT、一部の子が終了したことを通知します。このオプションは、子を待機可能な状態のままにします。つまり、必要な情報を収集するために別の待機ファミリー呼び出しを使用できます。その後、非 POSIXwait4()システム コールを使用して、終了したばかりの子の使用情報を取得し、必要なアカウンティングを処理できます。waitid()とのwait4()呼び出しの間で別のプロセスが終了したことに注意してください。に戻る前に、ループと適切なフラグとテストを使用して、使用可能な死体 (死んだ子プロセス) をすべて収集する必要があります。waitid()を呼び出して、以前は不完全だった他の子プロセスについて調べます。また、以前にバックグラウンドで開始され、現在終了しているプロセスの情報を返す関数の待機ファミリーについても心配する必要があります。

Linux の man ページのwait4(2)WNOWAITは、で直接動作する可能性があることを示唆しているwait4(2)ため、実際にオプションが必要な場合は、よりクリーンに実行できる可能性があります。

プロセス グループを使用して子プロセスをグループ化し、プロセス グループのメンバーの待機を容易にするかどうかを検討してください。

于 2009-09-27T22:38:43.783 に答える