程序计算从1到N的数字之和.. 子进程计算偶数的总和。 父进程计算奇数的总和。 我想在父进程中获取子进程的返回值。我该怎么做
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<stdlib.h>
#include<fcntl.h>
int main()
{
int N;
int id;
int fd_result;;
printf("Enter N till which you want the sum: \n");
scanf("%d",&N);
if ((fd_result=creat("result", 600))== -1)
{
perror("Error creating file");
exit(1);
}
if ((fd_result=open("result",O_TRUNC | O_RDWR)) == -1)
{
perror("Error Opening file");
exit(1);
}
if ((id=fork())<0)
{
perror("Error occurred forking....!");
exit(errno);
}
if (id == 0)
{
int i;
int sum=0;
for (i=0;i<=N;i=i+2)
sum+=i;
printf("Child sum: %d",sum);
if (write(fd_result,&sum,sizeof(int))==-1) perror("Error writing to file");
_exit(0);
}
if (id > 0)
{
int i;
int sum=0;
int sum_odd;
for (i=1;i<=N;i=i+2)
sum+=i;
lseek(fd_result,0,SEEK_SET);
read(fd_result,&sum_odd,sizeof(int));
printf("\nThe sum is: %d",sum+(int)sum_odd);
}
close(fd_result);
return 0;
}
请告诉我如何获得子进程的返回值?
答案 0 :(得分:9)
答案 1 :(得分:2)
糟糕!这不是重击!总之...
产生一个过程的原因是继续主流,同时做一些不会影响它的事情。我正在浏览10k图像的目录,&amp;搬出重复的。我把比较代码放在一个函数&amp;子进程。它非常快。
获取值的方法是创建一个管道,将值回显到该管道然后读取管道:(警告!以下代码可能不起作用,它只显示一个工作管道)
mkfifo pipe
moved=0
# Use imageMagick 'compare' to find files with zero difference:
comPare () {
if [[ ! $(compare -metric AE $1 $2) ]]; then
mv $2 moved;
echo 1 > pipe;
else echo 0 > pipe
fi
}
# For every file in the dir, compare it to every other one:
for file1 in $( ls *.bmp | head -n $(( $( ls *.bmp | wc -l) - 1)); do
for file2 in $( ls *.bmp | tail -n $(( $( ls *.bmp | wc -l) - 1)); do
comPare file1 file2 &
moved=$(( $(cat pipe) + 1 ))
done
done
rm pipe
echo "Moved $moved files"
到目前为止唯一的问题是我正在使用USB驱动器,&amp;权限阻止我创建管道。除此之外......
答案 2 :(得分:1)
像dtmilano所说,你应该使用wait或waitpid,视情况还是需要。
但也许您应该将程序拆分为两部分并使用exec执行子程序。当你生成fork你的子进程接收pid等于0时我不知道你是否尝试等待进程的信号与pid 0将正常工作。
无论如何,你可以通过,但这不是最好的方式,你的子进程通过退出计算的值。
答案 3 :(得分:1)
如果您想保留用于表示成功或失败退出状态的返回值,您可以在分叉之前调用pipe(2)
,然后在父母和子女之间建立单独的通道。
答案 4 :(得分:1)
TLDR
int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus
参考
waitpid
的联机帮助页显示其类型签名是:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
它还声明我们可以使用 stat_loc
参数存储进程信息:
如果参数stat_loc
的值不是空指针,信息将存储在stat_loc
指向的位置
stat_val
参数是 stat_loc
指向的整数值。
然后我们使用 WEXITSTATUS(wstatus)
从进程中提取我们的返回值。
WEXITSTATUS(stat_val
):
如果 WIFEXITED(stat_val) 的值不为零,则该宏计算子进程传递给 _exit() 或 exit() 的状态参数的低 8 位,或子进程的值从 main() 返回。