作为家庭作业的一部分,我需要制作一个运行.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