Program calculates sum of numbers from 1 to N.. Child process calculates sum of EVEN numbers. Parent process calculates sum of odd numbers. I want to get the return value of child process in parent process. How do i do that
#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;
}
Pls tell me how do I get the return value of child process?
What you are looking for is wait() or waitpid().
TLDR
int wstatus;
waitpid(<pid>, &wstatus, 0); // Store proc info into wstatus
int return_value = WEXITSTATUS(wstatus); // Extract return value from wstatus
Reference
The manpage for waitpid
shows its type signature is:
pid_t waitpid(pid_t pid, int *stat_loc, int options);
It also states that we can store process information with the stat_loc
argument:
if the value of the argument
stat_loc
is not a null pointer, information shall be stored in the location pointed to bystat_loc
the
stat_val
argument is the integer value pointed to bystat_loc
.
We then use WEXITSTATUS(wstatus)
to extract our return value from the process.
WEXITSTATUS(
stat_val
): If the value of WIFEXITED(stat_val) is non-zero, this macro evaluates to the low-order 8 bits of the status argument that the child process passed to _exit() or exit(), or the value the child process returned from main().
Oops! This isn't bash! Anyway...
The reason for spawning a process is to continue the main flow, doing something meanwhile that doesn't affect that. I'm running through directories of 10k images, & moving out duplicates. I put the compare code in a function & subprocess that. It's very fast.
The way to get a value back is to create a pipe, echo a value onto that then read the pipe: ( Warning! the following code probably doesn't work, it just shows a working pipe)
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"
The only problem so far is that I'm working on a usb drive, & permissions are stopping me from creating the pipe. Apart from that ...
Like dtmilano said you should use wait or waitpid, depending or need.
But maybe you should split your program in two parts and execute the son with exec. When you make fork your child process receive pid equal 0 and I don't know if you try to wait signals of process with pid 0 will work fine.
Anyway you can pass, though it's not the best way, the value calculated by your child process through exit.
If you want to preserve the return value for signaling a successful or failure exit status, you can call pipe(2)
before forking to set up a separate channel between parent and child.
精彩评论