我正在执行此代码:
void update_process(PROCSP * process){
int state;
printf("process.pid = %d\n", process->pid);
if (process->state== TERM || process->state == SIG)
return;
process->prio = getpriority(PRIO_PROCESS, process->pid);
errno = 0;
if (wait4(process->pid, &state, WNOHANG | WUNTRACED, &(process->r)) != -1){
if (WIFEXITED(state))
process->state= TERM;
else if(WIFSIGNALED(state))
process->state= SIG;
else if(WIFSTOPPED(state))
process->state= STOP;
else process->state= ACT;
} else{
perror("wait4");
return;
}
}
奇怪的是,当我在调用函数wait4之后打印state的值时它没有改变,所以函数给了我错误的状态。 我确信该进程存在并且它具有正确的pid(至少当我在Linux中执行“ps all”时它显示的是与我传递给函数的pid相同的pid)。
所有这些代码都在fork和execv之后执行(包含在函数CMD_execute中):
void CMD_background(char * argv[]){
if(argv[0]==NULL){
return;
}
pid_t pid = fork();
if (pid == 0){
CMD_execute(argv);
return;
} else {
background_add_proc(argv, pid);
}
}
我也将wait4更改为waitpid,但同样的事情发生了。
可能是什么问题?
谢谢!
答案 0 :(得分:1)
您可能忽略了SIGCHLD。在这种情况下,您无法检查子进程的退出代码。如果看起来你的代码看起来没有忽略信号,请查看你正在使用的任何第三方库,我相信Oracle会忽略它,所以一些第三方库改变了信号的默认行为。
答案 1 :(得分:1)
我的手册页上写着When the WNOHANG option is specified and no processes wish to report status, wait4() returns a process id of 0.
,这可能就是正在发生的事情。
state
仅在进程实际退出/停止时设置,而wait4返回值> 0.没有具体说明,但只有这样才有意义,因为没有WIFRUNNING
宏。