簡體   English   中英

等待子進程是否終止-C

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM