C-在不同工艺中使用不同的管端

C-在不同工艺中使用不同的管端,c,linux,pipe,system-calls,dup2,C,Linux,Pipe,System Calls,Dup2,我一直在搜索和阅读手册,但仍然无法获得管道机制。我正在制作一个程序,该程序应执行以下操作: 父进程创建管道,两个子进程并等待 第一个子进程生成成对的随机数,并通过管道将它们以空格形式传递给第二个进程。一直持续到 从父级获取信号 第二个子对象重定向其输入,使其成为第一个子对象的输出,并将输出重定向到out.txt文件。然后它执行 已编译程序,计算(1)中数字的GCD 父对象关闭管道并杀死子对象 所以我得到了这个C代码(我减少了它,这样帖子就可以符合规则): const int PIPE\u RE

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

  • 父进程创建管道,两个子进程并等待

  • 第一个子进程生成成对的随机数,并通过管道将它们以空格形式传递给第二个进程。一直持续到 从父级获取信号
  • 第二个子对象重定向其输入,使其成为第一个子对象的输出,并将输出重定向到out.txt文件。然后它执行 已编译程序,计算(1)中数字的GCD
  • 父对象关闭管道并杀死子对象

  • 所以我得到了这个C代码(我减少了它,这样帖子就可以符合规则):

    const int PIPE\u READEND=0;
    管道内常数=1;
    (...)
    如果(child1==0){
    //这里是Child1代码
    关闭(fd[1]);
    struct-sigaction-sa;
    sa.sa_handler=sigHandler;
    sigemptyset(和sa.sa_面具);
    sa.sa_标志=0;
    if(sigaction(SIGUSR1,&sa,NULL)==-1){//处理SIGUSR1信号
    perror(“信号处理意外错误”);
    出口(errno);
    }
    INTA,b;
    srand(time&t));
    if(dup2(fd[PIPE_READEND],1)<0){//将标准输出重定向到管道fd。
    perror(“在Child1中将标准输出重定向到管道错误”);
    出口(errno);
    } 
    关闭(fd[0]);
    而(1){
    a=兰德();
    b=兰德();
    printf(“%d%d\n”,a,b);
    睡眠(1);
    }
    (...)
    如果((child2=fork())<0){
    perror(“Child2过程中的Fork错误”);
    出口(errno);
    }else if(child2==0){
    //这里是Child2代码
    关闭(fd[管道读取端]);
    文件*outfile=fopen(“out.txt”,“w”);
    dup2(fd[PIPE_WRITEEND],0);
    dup2(输出文件,1);
    关闭(fd[管道写入]);
    execl(“c1/main”、“main”、“char*)NULL);
    
    问题是,在执行它之后,out.txt仍然是空的。我对管道数组索引感到失望,哪一个用于什么

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

    这没有任何意义。
    dup2
    函数没有将
    文件*
    作为参数。使用
    open
    ,而不是
    fopen
    从错误的管道索引中写入和读取。您需要更改它们:

    这会将标准输出重定向到管道输入

       close(fd[0]);
       dup2(fd[1], STDOUT_FILENO);
    
    这会将管道输出重定向到标准输入

       close(fd[1]);
       dup2(fd[0], STDIN_FILENO);
    
    另外,
    dup2
    接受整数,而不是指针,因此您应该执行以下操作:

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

    @Stargateur Emm,谢谢,仍然是空的。但是,我注意到了一件事。在
    execl()
    命令中执行的程序在完成时向stdout提示“完成”。我的程序在完成时提示“终止”。并且“完成”出现在“终止”之前,因此
    execl()
    不知何故没有等待主程序及其编号。虽然看不到修复的方法。@DavidSchwartz谢谢你的建议。我对它做了一点修改,但还是遇到了同样的问题。int fdOut=open(“out.txt”,O_WRONLY | O| create | O| TRUNC,S|irsr | S| IWUSR | S| IRGRP | S| IROTH);dup2(fdOut,1)//将输出重定向到“out.txt”关闭(fd[PIPE_WRITEEND]);execl(“c1/main”,“main”,“char*)NULL);观察错误可能在哪里?就像我们没有你的其他程序的代码一样。我们帮不了你更多。你有很多奇怪的代码。例如,你用PIPE[0]替换了1。这是无用的,因为在管道出口处写入不起作用。我不明白您为什么要使用信号。您需要从读取端读取,然后写入到写入端。您正在从写入端读取,然后写入到读取端。
       f = fopen("out.txt", "w");
       dup2(fileno(f), STDOUT_FILENO);