C如何使用exec函数和管道

时间:2016-04-01 15:33:35

标签: c pipe dup2

我正在编写一个程序,父亲要求用户插入数字来计算数字的阶乘。该数字在factorial.c中计算

所以我想我需要做的是:

- 向用户询问一个号码:

-Factorial.c读取数字并计算数字

-Factorial.c写下计算的数字

- 使用dup2重定向输出

      // 2 Pipe and Fork created
      if(x == 0){ //Father

       close(p1[0]);
       write(p1[1],&number_by_keybord, BUFFER);
       close(p1[1]);
       close(p[1]);     

       dup2(p[0],0);  //Read the number returned by factorial.c
       read(p[0], &num_factorial,BUFFER);
       printf("Pipe: factorial %d\n", num_factorial);           
       close(p[0]);                 
       wait(NULL);

  }else{        
    execlp("./factorial", "factorial", NULL);
    perror("Exec error\n");
   }    

现在是factorial.c

   void main(){
       read(0,&num,sizeof(int));

       //Number calculated

      write(1,&result,sizeof(int));
     return 0;
     }

但是当我执行程序冻结或只是计算随机数时

dup2有什么问题吗?我想要检索正确的结果我必须做dup2(,0)和因子我需要读取和写入

谢谢!

1 个答案:

答案 0 :(得分:0)

很难猜测,因为你没有显示足以复制你的问题,但是在这段代码中似乎存在问题:在child中(fork返回0到 child 和child pid到 parent )您正确写入管道,并从其他管道读取,但在另一个进程中,您无法将管道重定向到0个1文件描述符。你应该写:

...
}else{
    dup2(p1[0], 0);
    dup2(p[1], 1);
    execlp("./factorial", "factorial", NULL);
    perror("Exec error\n");
}