大家好,我有这段代码应该像终端一样实现管道(|),例如: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);
}
这段代码可以正常工作并正确执行命令,但是每次运行它都会给我一个分段错误并杀死不应该发生的父进程。有谁看到这个分段错误发生在哪里?我找不到它。