子进程运行5秒后如何对其进行超时(子进程执行)

时间:2019-04-22 11:16:01

标签: c timeout

作为家庭作业的一部分,我需要制作一个运行.out文件的子进程。 并将其超时设置为5秒 子进程执行一个执行程序,我想知道如何知道 如果子进程超时或在父进程中正常退出 等待它完成。

我在网上找到了设置超时的setrlimit函数 在RLIMIT_CPU上运行了5秒钟,并且可以正常工作,但是没有办法 检查子进程是否超时

我也尝试使用NOHANG的waitpid进行while循环 并使用time()函数检查是否过了5秒 但问题是子进程实际上不是5秒 在其中运行,但实时运行了5秒。因此,在一台计算机上运行正常,但在另一台计算机上,它实际上并没有运行5秒但更短,因此超时。

非常感谢您!

这是rlimit的代码:

struct rlimit limit = {5, 5};
        setrlimit(RLIMIT_CPU, &limit);
        if (execvp(outFilePath, argv) == -1) {
            return ERROR_OCCURED;
        }

和等待:

while (TRUE /*&& currentTime - start < 5*/) {
            if (waitpid(newPid, &newStatus, WNOHANG) != -1) {
                if (WIFSIGNALED(newStatus)) {
                    break;
                }
                if (WIFEXITED(newStatus)) {
                    hasTimeOut = FALSE;
                    break;
                }
            } else {
                if (errno == ECHILD) {
                    hasTimeOut = FALSE;
                    break;
                } else {
                    return -1;
                }
            }
            sleep(0);
            //currentTime = time(NULL);
        }

然后将while之前的hasTimeout设置为TRUE

0 个答案:

没有答案