【问题标题】:Parent trying to read children exit status (or return value), fork and wait父母试图读取孩子退出状态(或返回值),分叉并等待
【发布时间】:2013-03-26 17:20:42
【问题描述】:

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

那 2 段 sn-ps 代码应该可以让我看到它的子节点的退出值,然后打印出来。 子进程函数:

    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。解决方案是返回一个短数字,或者像我在之前的“已解决”评论中所做的那样。

【问题讨论】:

    标签: c fork solaris wait exit


    【解决方案1】:

    问题是你没有等待孩子退出

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

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

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

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

    我建议你使用

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

    【讨论】:

    • 实际上,我已经在代码中编辑了该部分。我从你在这里的建议开始,同样的问题。现在仔细检查 - 除了我放了等待($status),同样的问题。
    • 您能否更清楚您现在面临的问题?
    • 好,举个例子吧。假设 in="echo"。 childFunction() 将以 return 0 退出,状态将等于 0,c 某个数字。同时,如果我尝试 in="blabla",theChildFunction() 将以return 255 退出。但是,状态仍将等于 0!如何从wait()中获取退出值
    • 我认为您的代码的问题是系统系统调用。在正确执行的情况下,系统调用返回 0,如果出现错误,它返回 -1。为了调试,我首先建议让你的代码独立工作,即在没有 fork 的情况下调用函数并检查函数的返回是否是你真正想要的
    • 已检查。是的,该函数返回正确的值(实际上是 255,而不是 -1)。
    猜你喜欢
    • 1970-01-01
    • 2018-05-14
    • 2013-02-26
    • 2017-12-18
    • 2021-02-16
    • 2012-08-29
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    相关资源
    最近更新 更多