How to get return value from child process to parent?

前端 未结 2 1964
走了就别回头了
走了就别回头了 2020-12-19 11:20

I\'m supposed to return the sum of first 12 terms of Fibonacci series from child process to parent one but instead having 377, parent gets 30976.

相关标签:
2条回答
  • 2020-12-19 11:26

    I'm supposed to return the sum of first 12 terms of Fibonacci series from child process to parent one but instead having 377, parent gets 30976.

    Process exit status is limited in value, therefore it is not the best way to communicate a value between child and parent.

    One of the solution is to pass the calculated value using pipes.

    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main(int argc, char *argv[])
    {
        pid_t childpid;
        int i, fib_sum=0, fib1=1, fib2=1, temp, status;
    
        int fd[2];
        int val = 0;
    
        // create pipe descriptors
        pipe(fd);
    
        childpid = fork();
        if(childpid != 0)  // parent
        {
            close(fd[1]);
            // read the data (blocking operation)
            read(fd[0], &val, sizeof(val));
    
            printf("Parent received value: %d\n", val);
            // close the read-descriptor
            close(fd[0]);
        }
        else  // child
        {
            // writing only, no need for read-descriptor:
            close(fd[0]);
    
            for(i=1; i<=12; i++)
            {
                temp = fib1;
                fib_sum = fib1+fib2;
                fib1 = fib_sum;
                fib2 = temp;
            }
    
            // send the value on the write-descriptor:
            write(fd[1], &fib_sum, sizeof(fib_sum)); 
            printf("Child send value: %d\n", fib_sum);
    
            // close the write descriptor:
            close(fd[1]);
    
            return fib_sum;
        }
    }
    

    Test:

    Child send value: 377                                                                                                                         
    Parent received value: 377
    
    0 讨论(0)
  • 2020-12-19 11:51

    If you can't use pipes, which would be the optimal solution here, you could save the result to a file that the parent would read from. Pass the name of the file to save the result to from parent to child. In your child process, you would do:

    int main(int argc, char *argv[])
    {
        int fib_sum=0;
        if (argc <= 1)
        {
            print_usage();
            return 1;
        }
        //... calculate fib_sum
        FILE *f = fopen(argv[1], "w");
        if (f == NULL)
        {
            printf("Error opening file!\n");
            return 1;
        }
        fprintf(f, "%d", fib_sum);
        return 0;
    }
    

    Then in your parent process:

    int n = 0;
    FILE* f;
    //... spawn child and wait
    FILE *f = fopen(file_name, "r");
    fscanf(f, "%d", &n);
    
    0 讨论(0)
提交回复
热议问题