多进程分段错误

时间:2013-11-14 23:45:41

标签: c unix multiprocessing pipe

大家好我有这个代码应该实现管道(|)就像终端一样: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);
    }

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

0 个答案:

没有答案