0

大家好,我有这段代码应该像终端一样实现管道(|),例如:ls | 排序 | grep 主要。这是我处理管道的代码部分:

    int pp[numPipes*2];
    for(i = 0; i < numPipes; i++){
        if(pipe(pp + i*2) < 0){ perror("pipe failed"); exit(-1); }
    }

    char **hold[numPipes+1];

    int j = 0;
    hold[j++] = args;

    for(i = 0; i < nargs; i++){
        if(!strcmp(args[i], "|")){
            hold[j++] = args+i+1;

            args[i] = NULL;

        }       
    }
    hold[j] = NULL;
    i = 0;
    j = 0;

    while(hold[i][0]){

      pid = fork();

      if(pid == 0) { //child process 

            if(i != 0){
            dup2(pp[(i-1)*2], 0);
        }

        if(i != numPipes){
            dup2(pp[i*2+1], 1);
        }
        int c;
        for( c = 0; c < 2 * numPipes; c++ ){
                close( pp[c] );
        }

        execvp(hold[i][0], hold[i]);
        //return only when exec fails 
        perror("exec failed");
        exit(-1);

      } else if(pid > 0) {//parent process 


        if(!async){

            //waitpid(-1, NULL, 0);

        }else printf("this is an async call\n");

      } else { //error occurred 
        perror("fork failed");
        exit(1);
      }
    i++;

    }

    int c;
    for( c = 0; c < 2 * numPipes; c++ ){
        close( pp[c] );
    }
    for(i = 0; i < numPipes+1; i++){
        wait(&status);
    }

这段代码可以正常工作并正确执行命令,但是每次运行它都会给我一个分段错误并杀死不应该发生的父进程。有谁看到这个分段错误发生在哪里?我找不到它。

4

0 回答 0