正在等待子进程终止,或者不是-C



我正在为我的一个班做作业,没有教授/同学回复我。所以在你回答之前,请不要给我任何确切的答案!只有解释!

我要做的是编写一个c程序(timeout.c),它接受两个命令行参数W和T,其中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 Wn");
    printf ("is the number of seconds the childn");
    printf ("should do work for, and T is the numbern");
    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()仍然是收集终止的子项所必需的。

相关内容

  • 没有找到相关文章

最新更新