wait4和waitpid没有返回正确的状态

时间:2012-03-22 20:28:28

标签: c linux

我正在执行此代码:

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,但同样的事情发生了。

可能是什么问题?

谢谢!

2 个答案:

答案 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宏。