我需要能够从子进程中获取返回的值,而不必保留父进程的执行。
请注意,子进程中可能会发生运行时错误。
这是我要制作的程序:
//In parent process:
do
{
read memory usage from /proc/ID/status
if(max_child_memory_usage > memory_limit)
{
kill(proc, SIGKILL);
puts("Memory limit exceeded");
return -5; // MLE
}
getrusage(RUSAGE_SELF,&r_usage);
check time and memory consumption
if(memory limit exceeded || time limit exceeded)
{
kill(proc, SIGKILL);
return fail;
}
/*
need to catch the returned value from the child somehow with
this loop working.
Notice the a runtime error could happen in the child process.
*/
while(child is alive);
答案 0 :(得分:2)
waitpid
函数具有一个名为WNOHANG
的选项,如果给定的子代尚未返回,则该函数将立即返回:
pid_t rval;
int status;
do {
...
rval = waitpid(proc, &status, WNOHANG);
} while (rval == 0);
if (rval == proc) {
if (WIFEXITED(status)) {
printf("%d exited normal with status %d\n", WEXITSTATUS(status));
} else {
printf("%d exited abnormally\n");
}
}
有关检查各种异常退出条件的更多详细信息,请参见man page for waitpid
。
答案 1 :(得分:1)
使用WNOHANG标志的解决方案仅在您只需要检查一次孩子的退出状态时才有效。但是,如果您希望在子项退出时获取退出状态,那么无论多晚,最好的解决方案是为SIGCHLD信号设置信号处理程序。 当子进程正常或异常终止时,SIGCHLD将被发送到父进程。在此信号处理程序中,您可以调用wait来获得孩子的退出状态。
void child_exit_handler(int signo){
int exit_status;
int pid = wait(&exit_status);
// Do things ...
}
// later in the code, before forking and creating the child
signal(SIGCHLD, child_exit_handler);
根据程序的其他语义,您可能需要使用waitpid
。 (如果程序已停止但未终止,则也可能会调用SIGCHLD。wait(2)
的手册页描述了要检查的宏。)