从子进程接收返回值到父进程?

时间:2018-03-13 20:22:31

标签: c pipe fork computer-science

我在这里阅读了一些线索,以获取相关信息。我理解了一些,但大多数是用不同的方法编写的。我无法找到有关如何通过return语句从子进程返回值的充分信息。我责怪自己不够努力,但我正陷入一个泥泞的水坑。感谢任何信息。

我的目标(学校作业)是让子进程从父母那里读取信息。孩子将以数学方式(加法)计算从父母接收的每个值,然后将最终值发送回父母以打印到屏幕上。

规则:  1.不能仅在子进程内使用命令行参数  2.所有数学计算必须在子进程内部。  3.不需要进行错误检查。

以下是我所拥有的一些代码:

int main(int argc, char **argv){
  char buf[256];
  int pipeCommunication[2];
  pipe(pipeCommunication);

  pid_t pid = fork();

  if(pid == 0){
    //inside child process
    int sum = 0;
    read(pipeCommunication[0], buf, sizeof(buf));
    sum += atoi(buf);
    return sum; //WHY DOES IT NOT RETURN THE VALUE OF SUM?
  }else{
   int sum = 0;
   for(int i = 1; i<argc;i++){
     write(pipeCommunication[0], argv[i], sizeof(argv);
     wait(NULL);
   }
   printf("sum = %d\n", sum); //WHY CANT I SEE THE VALUE OF SUM FROM CHILD?
   return 0; 
  }
}

命令行输入为:./ apprun 1 2 3 输出:6 (加1 + 2 + 3 = 6)

编辑:我已经意识到我的写或读函数可能需要清除以允许将另一个值读入子进程。仍在努力解决这个问题。

编辑:我已完成作业,如果有人想查看最终代码,我会在此处发布结果。之后,这个线程就完成了。

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>

#define SIZE argc-1

int main(int argc, char **argv)
{
  int   userInput[SIZE];        
  int       temp;                  
  int     uiSize = sizeof(userInput)/sizeof(userInput[0]);    

  int   pipeCom[2];             
  pipe(pipeCom);                  

  printf("CS201 - Assignment 3 Regular - Jonathan Vazquez\n");

  pid_t pid = fork();

  if (pid == 0) {

      int sum = 0;

      close(pipeCom[1]);                              
      for(int i = 0;i < uiSize; i++){
          read(pipeCom[0], &temp, sizeof(temp));      
          sum += temp;                                
          temp = 0;                                   
      }

      return sum;                                     
  }else {

      int sum = 0;                                                  
      for(int i = 1; i < argc; i++){
        userInput[i] = atoi(argv[i]);               
      }

      close(pipeCom[0]);                              
      for(int i = 1; i < uiSize+1;i++){              
          write(pipeCom[1], &userInput[i], sizeof(userInput));    
      }

      int status;
      wait(&status);                                  
      sum = WEXITSTATUS(status);                      
      printf("sum = %d\n", sum);
      return 0;
  }
 }

1 个答案:

答案 0 :(得分:0)

子项的主函数的返回值(此处返回的'sum')可作为子项的退出状态访问父项。退出状态限制为8位(不是完整整数),因此它通常仅用于返回有限的错误代码而不是值,但它可能足以满足您的需要。

要在父级中获取子级的退出代码,您需要将指向状态变量的指针传递给等待而不是NULL。将wait(NULL)行替换为:

int status;
wait(&status);
sum = WEXITSTATUS(status);

或者(建议8位通常是不够的),你可以创建一个从子项回到父项的第二个管道,让孩子将总和写入该管道并让父项读取它。