子プロセスが終了するのを待っています。
-
20-12-2019 - |
質問
私は私のクラスの1つの課題をしようとしていて、教授/仲間のクラスメートは私に戻っていない。それであなたが答える前に、正確な答えを私に与えないでください!説明のみ!
私が何をしなければならないのは、2つのコマンドライン引数を取り込むWRITE ACプログラム(Timeout.c)、W、Tは、w、wは秒が終了する前に秒数が秒単位の時間で、tは親プロセスが子プロセスを待機する時間、子プロセスを強制終了し、「タイムアウト」メッセージを印刷する必要があります。基本的に、w> tの場合、タイムアウトがあるはずです。それ以外の場合、子供はその作業を終了してからタイムアウトメッセージが印刷されていないはずです。
私がやりたいと思ったのは、親プロセスがt秒の間スリープされてから、子プロセスを強制終了してタイムアウトを印刷しますが、タイムアウトメッセージを印刷すると、どちらの場合もいいえです。子プロセスが終了したことを確認するにはどうすればいいですか?私はこのために警告()を使うように言われました、しかし私はその関数を使うことがどのようなものであるかについてはわかりません。
誰かが外観を望んでいる場合の私のコードです:
void handler (int sig) {
return;
}
int main(int argc, char* argv[]){
if (argc != 3) {
printf ("Please enter values W and T, where W\n");
printf ("is the number of seconds the child\n");
printf ("should do work for, and T is the number\n");
printf ("of seconds the parent process should wait.\n");
printf ("-------------------------------------------\n");
printf ("./executable <W> <T>\n");
}
pid_t pid;
unsigned int work_seconds = (unsigned int) atoi(argv[1]);
unsigned int wait_seconds = (unsigned int) atoi(argv[2]);
if ((pid = fork()) == 0) {
/* child code */
sleep(work_seconds);
printf("Child done.\n");
exit(0);
}
sleep(wait_seconds);
kill(pid, SIGKILL);
printf("Time out.");
exit(0);
}
. 解決
waitpidはあなたに子供の返品状況を取得しますが、そのデフォルトの使用法は、子が終了するまで保持するように親を強制的に押します。
あなたの要求(私が正しく理解されている場合)は、ある時間を待つために親があるだけで、Alarm()を使用してそれをすることができます。
その後、子がまだ終了していない場合はすぐに戻る特定のオプションを使用してwaitpid()を使用する必要があります(APIのパラメータを調べてください)。だから子供が終了しなかった場合は、それを殺すことができます、そうでなければあなたはすでにその返却ステータスを受け取ります。
他のヒント
Commandが終了するとすぐにtimeout
プログラムが停止するようにしたいので、timeout -t 1000 sleep 1
とProfectingプログラムは約1秒後に停止します。
それをする方法は、alarm()
システムコールとSIGALRM
のシグナルハンドラとともに、ある種のalard-classialのアラームを設定し、メインプロセスにwait()
またはwaitpid()
を実行することです。死体を起動して集める。親プロセスがアラーム信号を取得すると、そのメッセージを印刷して、その子どもにある種の死亡の脅威を送ることができます。Sigkillに頼る前にSigtermやSighupを試すのは賢明かもしれません。SigtermとSighupの信号は、誤って誤ってクリーンアップする機会を与えますが、Sigkillはそうではありません。
信号の管理方法を知っている場合は、親プロセスでSIGALRMとSIGCHLDをキャッチすることができます。SIGCHLDは、クライアントが終了すると、タイマーが期限切れになるとSIGALRMが発生します。最初の発生した信号がSIGALRMの場合、タイムアウトは期限切れです。そうしないと、親がキャッチがSIGCHLDの最初の信号がSIGCHLDの場合、その子はタイムアウトの満了前に停止しました。
wait()またはwaitpid()が終了した子を収集するにはまだ必要です。