wait() 和 exit() 调用的错误输出
Errorneous output with wait() and exit() call
为什么对于给定的输入,下面代码的答案总是 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
两个问题。首先 exit
(如联机帮助页中明确说明)将您传递给它的状态截断为在 0 到 255 (0377)
范围内
and the value of status & 0377 is returned to the parent
其次,您没有正确使用 wait
返回的值。要获得子项的 exit
值,您需要使用 WEXITSTATUS(x)
,其中 returns 值的最低有效 8 位与 x & 255
.[=18 相同=]
无论哪种方式,您传回 sum
的值的方法都不会按原样工作 - 您最好研究一下 pipe
的工作原理。
为什么对于给定的输入,下面代码的答案总是 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
两个问题。首先 exit
(如联机帮助页中明确说明)将您传递给它的状态截断为在 0 到 255 (0377)
and the value of status & 0377 is returned to the parent
其次,您没有正确使用 wait
返回的值。要获得子项的 exit
值,您需要使用 WEXITSTATUS(x)
,其中 returns 值的最低有效 8 位与 x & 255
.[=18 相同=]
无论哪种方式,您传回 sum
的值的方法都不会按原样工作 - 您最好研究一下 pipe
的工作原理。