2014-09-25 92 views
0

我试图创建两个子进程:çDUP未定义的错误

的儿童读取一个文件,该文件被传递作为参数的输入,并写入到输出管道。

另一个孩子从管道读取其输出并将其输出写入一个文件,该文件也作为参数传入。

父级为子级设置了一些文件描述符,并且在创建子级时,他们完成了操作描述符以满足其需要。

但是,我遇到了设置文件描述符的问题,特别是当我尝试关闭并复制输入文件描述符以代替stdin时。

这里是我的所有代码:

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

int main(int argc, char *argv[]) 
{ 
    //Open input file 
    int fdin; 
    fdin = open(argv[1], O_RDONLY); 
    //Check if opening the file was successful 
    if(fdin > 0) 
    { 
     //Open output file 
     int fdout; 
     //Create the output file and 
     //check if the output file was created 
     if((fdout = creat(argv[2], 0644)) > 0) 
     { 
      //Captures whether the dup's were successful 
      int dup_in; 
      int dup_out; 

      //Close stdin so we can replace it with our input file 
      close(0); 
      //Attempt to put the input file at position 0 
      //and check if the dup was successful 
      if((dup_in = dup(fdin)) > 0) 
      { 
       //Close stdout so we can replace it with our output file 
       close(1); 

       //Attempt to put the output file at position 1 
       //and check if the dup was successful 
       if((dup_out = dup(fdout)) > 0) 
       { 
        //Pipe success 
        int pipecreate; 
        //Pipe file descriptors 
        int pipe_fd[2]; 

        //Make the pipe and check 
        //if it was successful 
        if((pipecreate = pipe(pipe_fd)) > 0) 
        { 
         //close unneeded file descriptors 
         close(fdin); 
         close(fdout); 

         //Process id for first child 
         int cpid1; 
         //Create first child process 
         cpid1 = fork(); 

         //Process creation successful, child block 
         if(cpid1 == 0) 
         { 
          //Read pipe dup success 
          int rpipe_dup; 
          //close f_in 
          close(0); 

          rpipe_dup = dup(pipe_fd[0]); 

          //Dup successful 
          if(rpipe_dup > 0) 
          { 
           //close uneeded file descriptors 
           close(pipe_fd[0]); 
           close(pipe_fd[1]); 

           execl("count", "count", (char *) 0); 

           char readbuf[100] = {0}; 

           read(2, readbuf, 100); 
          } 
          //Dup failed 
          else 
          { 
           fprintf(stderr, "Read pipe dup failed.\n"); 
           exit(EXIT_FAILURE); 
          } 
         } 
         //Process creation successful, parent block 
         else if(cpid1 > 0) 
         { 
          //Process id for second child 
          int cpid2; 
          //Create second child process 
          cpid2 = fork(); 

          //Process creation successful, child block 
          if(cpid2 == 0) 
          { 
           //Write pipe dup success 
           int wpipe_dup; 
           //close f_out 
           close(1); 

           wpipe_dup = dup(pipe_fd[1]); 

           //Dup successful 
           if(wpipe_dup > 0) 
           { 
            //close uneeded file descriptors 
            close(pipe_fd[0]); 
            close(pipe_fd[1]); 

            execl("convert", "convert", (char *) 0); 

            char readbuf[100] = {0}; 

            write(1, readbuf, 100); 
           } 
           //Dup failed 
           else 
           { 
            fprintf(stderr, "Write pipe dup failed.\n"); 
            exit(EXIT_FAILURE); 
           } 
          } 
          //Process creation successful, parent block 
          else if(cpid2 > 0) 
          { 
           //Close unneeded file descriptors 
           close(pipe_fd[0]); 
           close(pipe_fd[1]); 

           int pid; 
           int status; 

           pid = wait(&status); 
           pid = wait(&status); 

          } 
          //Dup failed 
          else 
          { 
           fprintf(stderr, "Error creating child process 2.\n"); 
           exit(EXIT_FAILURE); 
          } 
         } 
         //Process creation unsuccessful 
         else 
         { 
          fprintf(stderr, "Error creating child process 1.\n"); 
          exit(EXIT_FAILURE); 
         } 
        } 
        //Pipe creation failed 
        else 
        { 
         fprintf(stderr, "Error creating pipe.\n"); 
         exit(EXIT_FAILURE); 
        } 
       } 
       //Dup'ing the output file descriptor failed 
       else 
       { 
        fprintf(stderr, "Error dup'ing out file descriptor.\n"); 
        exit(EXIT_FAILURE); 
       } 
      } 
      //Dup'ing the input file descriptor failed 
      else 
      { 
       //fprintf(stderr, "Error dup'ing in file descriptor.\n 
       perror("\nError dup'ing in file descriptor: "); 
       exit(EXIT_FAILURE); 
      } 
     } 
     //Creat failed 
     else 
     { 
      fprintf(stderr, "Error creating out file.\n"); 
      exit(EXIT_FAILURE); 
     } 
    } 
    //Opening input file failed 
    else 
    { 
     fprintf(stderr, "Error opening in file.\n"); 
     exit(EXIT_FAILURE); 
    } 
} 

我上编译和运行MINIX3此。

这里是我如何运行,包括程序输出:

cc fork.c 
./a.out input.txt output.txt 

Error dup'ing in file descriptor: : Undefined error: 0 

任何帮助是极大的赞赏。

+1

我发现了原因。 DUP返回文件描述符,其在这种情况下是0。 如果((dup_in = DUP(fdin))> 0) 应 如果((dup_in> = DUP(fdin))> 0) – braab 2014-09-25 01:13:37

+0

如果你已经找到了你的问题的答案,发布作为答案,而不是评论。 – indiv 2014-09-25 01:43:13

回答

0

我发现了原因。

dup返回文件描述符编号,在这种情况下为0. if ((dup_in = dup(fdin)) > 0)应该是if ((dup_in >= dup(fdin)))

+0

你为什么在那里有'> 0'?为什么不只是'如果(dup_in> = dup(fdin))'? – hyde 2014-09-26 18:22:38

+0

'dup_in = dup(fdin)'和'dup_in> = dup(fdin)'显然是非常不同的陈述,并且不能远程替代对方。在后一种情况下,'dup()'的返回值不会被分配给'dup_in',并且会丢失。此外,您将尝试访问'dup_in'的值,该值在此处未初始化。或许你的意思是if((dup_in = dup(fdin))> = 0)',或者甚至更好,if((dup_in = dup(fdin))!= -1)'。 – 2014-09-26 18:30:37

+0

> 0并不意味着在那里,当我修好它的时候,我忘了删除它。 此外,保罗,我确实改变它if((dup_in = dup(fdin))> = 0) – braab 2014-09-26 18:45:22