c/c++语言开发共享父尝试读取子退出状态(或返回值),fork和wait

我糊涂了。 据说,基于man和许多其他来源,如下所示: 当操作系统终止你的进程等待(和状态) 时返回代码应该能让我获得子进程的退出状态或返回值吗?

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

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:%db:%dn",status, WIFEXITED(status)); else return -1; i=0; 

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

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

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

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

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

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

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

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

    我建议你用

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

      以上就是c/c++开发分享父尝试读取子退出状态(或返回值),fork和wait相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519370.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐