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

我要做的是编写一个c程序(超时。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 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会让您返回孩子的返回状态,但它的默认用法将强制父级等待,直到孩子终止。

但您的要求(如果我理解正确)只希望父级等待一定时间,警报()可用于执行此操作。

然后,您应该使用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,则超时过期,否则,如果父捕集的第一信号是Sigchld,则该子子已在超时到期之前停止。

wait()或waitpid()仍然需要收集终止的孩子。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top