父尝试读取子退出状态(或返回值),fork和wait

时间:2013-03-26 17:20:42

标签: c fork solaris wait exit

我很困惑。据说,基于人类和许多其他来源,如下: Return code when OS kills your process 等待(& status)应该可以让我获得子进程的退出状态或返回值吗?

这两段代码,应该让我看到它的孩子的退出值,然后打印出来。 子进程函数:

    int childFunction(char in[],char logPath[]){
        FILE *logFile= fopen( logPath, "a" );
        if(logFile==NULL)
        return 1;
        int c=system(in);
        fclose(logFile);
        return(c);
    }

和主要:

        {...some unimportant code before this}
        result= fork();
        if(result==0){
            exit(childFunction(inLine,logPath));
        }
        else if(result>0){
            int status=0;;
            int c=(int)waitpid(-1,&status,0);
            printf("a:%d b:%d\n",status, WIFEXITED(status));
        else
            return -1;
        i=0;

我尝试了等待,睡了一段时间,退出,返回,并阅读了几次手册页。在我对这个功能的理解中存在一个基本错误,或者在看了4个小时后我再也看不到它了。

解决 由于某种原因,我绝对不明白,如果你将childFunction中的return(c)更改为if(c!=)return(1);else return(0),它将会起作用。不知道为什么。

已解决2 好的,现在我想我知道为什么。看,似乎返回调用或等待将状态减少到8个最高有效位(256)。那是什么意思?这意味着,如果发送普通int,则使用前几位,而丢弃最后8位。同时,当我指定return (1)编译器自动将“缩短”int为short int时。解决方案是返回一个简短的数字,或者像我在之前的“已解决”评论中那样做。

1 个答案:

答案 0 :(得分:5)

问题是你不是在等孩子退出

int c=(int)waitpid(-1,&status,WNOHANG);

这里父进程检查子进程是否已退出,如果子进程未退出则返回。

在上面的情况中,由于您在子进程中打开文件,因此在子进程中存在IO等待的可能性更大,因此将执行父进程。

现在父进程会检查状态,因为使用了WNOHANG,它将不会在waitpid被阻止而且会继续,这就是你没有得到正确状态的原因

我建议你使用

int c=(int)waitpid(&status);