C - 在不同的过程中使用不同的管端

时间:2016-12-07 23:45:49

标签: c linux pipe system-calls dup2

我一直在寻找和阅读手册,但仍然无法获得管道机制。我正在制作一个程序,应该执行以下操作:

  1. 父进程创建管道,两个子进程并等待。

    1. 第一个孩子生成一对随机数,并通过管道将它们与第二个过程之间的空间传递给它们。它一直持续到 得到父母的信号。
    2. 第二个子项重定向输入,因此它是第一个子项的输出,并将输出重定向到out.txt文件。然后它执行 已编译的程序,从(1)计算数字的GCD;
  2. 父关闭管道并杀死孩子。

  3. 所以我得到了这个C代码(我减少了它以便帖子符合规则):

    const int PIPE_READEND=0;
    const int PIPE_WRITEEND=1;
    
            (...)
    if (child1 == 0) {
            //Child1 code here
            close(fd[1]);
    
            struct sigaction sa;
            sa.sa_handler = sigHandler;
            sigemptyset(&sa.sa_mask);
            sa.sa_flags = 0;
            if (sigaction(SIGUSR1,&sa,NULL) == -1){ //Handling SIGUSR1 signal
                perror("Signal handling unexpected error");
                exit(errno);
            }
            int a,b;
            srand(time(&t));
            if (dup2(fd[PIPE_READEND],1) < 0){ //Redirecting stdout to the pipe fd.
                perror("In Child1 Redirecting stdout to pipe error");
                exit(errno);
            } 
            close(fd[0]);
            while(1){
                a = rand();
                b = rand();
                printf("%d %d\n", a, b);
                sleep(1);
            }
    
    
           (...)
    if ((child2 = fork()) < 0){
            perror("Fork error in Child2 process");
            exit(errno);
        } else if (child2 == 0){
            //Child2 code here
            close(fd[PIPE_READEND]);
            FILE *outfile = fopen("out.txt","w");
            dup2(fd[PIPE_WRITEEND],0); 
            dup2(outfile,1); 
            close(fd[PIPE_WRITEEND]);
            execl("c1/main","main",(char *)NULL);   
    

    问题是,执行后,out.txt保持为空。我对管道数组索引感到失望,其中一个用于什么。

2 个答案:

答案 0 :(得分:1)

    FILE *outfile = fopen("out.txt","w");
    dup2(fd[PIPE_WRITEEND],0); 
    dup2(outfile,1); 

这没有任何意义。 dup2函数不会将FILE *作为参数。使用open,而不是fopen

答案 1 :(得分:1)

您从错误的管道索引中读取和读取。你需要改变它们:

这会将stdout重定向到管道输入。

   close(fd[0]);
   dup2(fd[1], STDOUT_FILENO);

这会将管道输出重定向到stdin。

   close(fd[1]);
   dup2(fd[0], STDIN_FILENO);

同样dup2取整数,而不是指针,所以你应该这样做:

   f = fopen("out.txt", "w");
   dup2(fileno(f), STDOUT_FILENO);