Как получить возвращаемое значение из процесса ребенка? - PullRequest
8 голосов
/ 27 января 2010

Программа рассчитывает сумму чисел от 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;
}

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

Ответы [ 4 ]

9 голосов
/ 27 января 2010

Вы ищете wait () или waitpid () .

2 голосов
/ 21 декабря 2016

Oops! Это не Баш! Во всяком случае ...

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

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

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-накопителе, и разрешения мешают мне создать канал. Помимо этого ...

1 голос
/ 29 января 2010

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

1 голос
/ 27 января 2010

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

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

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

...