【问题标题】:Errorneous output with wait() and exit() callwait() 和 exit() 调用的错误输出
【发布时间】:2018-02-02 17:40:48
【问题描述】:

为什么对于给定的输入,以下代码的答案总是 32?

我预计是 400

代码应该从子进程获取输入并将其传递给父进程并在父进程中打印。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

int main(){
    pid_t p=fork();

    if(p>0){
            int x=-1;

            wait(&x);

            printf("sum: %d",x/255);
    }else{
            int sum=400,i;
            int n,x;

            scanf("%d",&n);
            for(i=0;i<n;i++){
                scanf("%d",&x);
                sum+=x;
            }

            exit(sum);
    }

    return 0;
} 

输入:

4

100 100 100 100

【问题讨论】:

  • 你给这个程序提供了什么输入?
  • @lurker 对此感到抱歉...我现在提到了他们
  • printf("sum: %d",x/255); 也许你打算x &amp; 0xff ? -->> man 2 wait
  • 我认为你应该使用WEXITSTATUS(x) 而不是x/255
  • 最后我们要注意的是,当你从400开始,加上100,4次,你最终得到800。这就是为什么你的退出代码是800%256=32,而不是400%256=144

标签: c linux wait exit


【解决方案1】:

两个问题。首先exit(如手册页中明确说明的那样)将您传递的状态截断为0到255(0377)的范围内

status & 0377 的值返回给父级

其次,您没有正确使用wait 返回的值。要获得孩子的exit 值,您应该使用WEXITSTATUS(x),它返回值的最低有效8 位,这与x &amp; 255 相同。

无论哪种方式,您传回 sum 值的方法都不会按原样工作 - 您最好调查一下 pipes 的工作原理。

【讨论】:

  • x &amp; 255 正确的可能性低于x / 255。更正确的是x / 256。低 8 位是信号和核心转储。但是WIFEXITED/WEXITSTATUS 是最好的。
  • @WumpusQ.Wumbley 我从wait 联机帮助页获得的x &amp; 255 部分...完全有可能我误读了它,它指的是exit 如何截断值
  • 感谢关于管道的建议。你能用 WEXITSTATUS 部分的例子来解释一下吗?
  • 如答案中所述,您将编写WEXITSTATUS(x) 以使用变量x 获取退出代码,因此在您的代码中您将拥有printf("sum: %d",WEXITSTATUS(x));
猜你喜欢
  • 2020-06-18
  • 2023-03-12
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
相关资源
最近更新 更多