Как получить возвращаемое значение из дочернего процесса?

программа вычисляет сумму чисел от 1 до N.. Дочерний процесс вычисляет сумму четных чисел. Родительский процесс вычисляет сумму нечетных чисел. Я хочу получить возвращаемое значение дочернего процесса в Родительском процессе. Как мне это сделать?--2-->

#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 скажите мне, как я могу получить возвращаемое значение дочернего процесса?

4 ответов


то, что вы ищете ждать() или waitpid ().


Упс! Это не Баш! В любом случае...

причина нереста процесса заключается в том, чтобы продолжить основной поток, делая что-то между тем, что не влияет на это. Я запускаю каталоги изображений 10k и перемещаю дубликаты. Я помещаю код сравнения в функцию & подпроцесс, который. Это очень быстро.

способ вернуть значение - создать канал, ЭХО-значение на это, а затем прочитать канал: (предупреждение! следующий код, вероятно, не работает, он просто показывает рабочая труба)

mkfifo pipe
moved=0
# Use imageMagick 'compare' to find files with zero difference:
comPare () { 
 if [[ ! $(compare -metric AE  ) ]]; then 
    mv  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-накопителе, и разрешения останавливают меня от создания трубы. Кроме этого ...


Как dtmilano сказал, что вы должны использовать wait или waitpid, в зависимости или необходимости.

но, возможно, вы должны разделить свою программу на две части и выполнить сына с exec. Когда вы делаете вилку, ваш дочерний процесс получает pid, равный 0, и я не знаю, пытаетесь ли вы ждать сигналов процесса с pid 0, будет работать нормально.

в любом случае вы можете пройти, хотя это не лучший способ, значение, вычисленное вашим дочерним процессом через exit.


Если вы хотите сохранить возвращаемое значение для сигнализации об успешном или неудачном состоянии выхода, вы можете вызвать pipe(2) перед разветвлением создать отдельный канал между родителем и ребенком.