[英]Waiting for child process to terminate, or not - C
我正在為我的一個班級做作業,沒有教授/同班同學回到我身邊。 因此,在您回答之前,請不要給我任何確切的答案! 僅說明!
我要做的是編寫一個包含兩個命令行參數W和T的ac程序(timeout.c),其中W是退出子進程之前應花費的時間(以秒為單位),T是該時間父進程應先等待子進程,然后再終止子進程並打印出“超時”消息。 基本上,如果W> T,應該有一個超時。 否則,孩子應該完成工作,然后不會打印超時消息。
我想做的就是讓父進程休眠T秒鍾,然后終止子進程並打印超時,但是在兩種情況下都不會出現超時消息。 如何檢查子進程已終止? 有人告訴我為此使用alarm(),但是我不知道該功能將用什么。
如果有人想看一下,這是我的代碼:
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的參數)。 因此,如果孩子沒有退出,則可以殺死它,否則您已經收到了返回狀態。
您希望timeout
程序在命令完成后立即停止,所以如果您說timeout -t 1000 sleep 1
則保護程序將在大約1秒鍾后停止,而不是在1000秒后停止。
做到這一點的方法是設置某種警報-傳統上,使用alarm()
系統調用和SIGALRM
的信號處理程序-然后讓主進程執行wait()
或waitpid()
以便當孩子死亡時,它醒來並收集屍體。 如果父進程收到警報信號,它可以打印其消息並向其子進程發送某種死亡威脅。 在使用SIGKILL之前嘗試SIGTERM和/或SIGHUP可能是明智的; SIGTERM和SIGHUP信號為錯誤的孩子提供了清理的機會,而SIGKILL則沒有。
如果您知道如何管理信號,則可以在父進程中捕獲SIGALRM和SIGCHLD。 客戶端終止時將引發SIGCHLD,計時器終止時將引發SIGALRM。 如果第一個引發的信號是SIGALRM,則超時到期;否則,如果父級捕獲的第一個SIGNAL是SIGCHLD,則子級在超時到期之前已停止。
仍需要使用wait()或waitpid()來收集終止的子級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.