我已經將此與以前的涉及管道的帖子進行了比較,我似乎無法找到問題。家長的一切似乎都應該關閉。當我輸入一個有效的命令(例如「ls | grep a」)時它工作正常,但如果它不是一個有效的命令(例如「ls | grup a)」,程序將停止響應用戶輸入(它會一直運行,但它不會執行)採取任何動作,當你輸入一個命令)基本shell程序的管道問題
主要功能:
int main() {
int i;
char **args;
int pipeCheck = 0;
int argCount = -1;
int blank = 0;
while(1) {
args = getln();
if (args[0] != NULL){
blank = 1;
if (strcmp(args[0],"exit")==0) exit(0);
}
for(i = 0; args[i] != NULL; i++) {
if (strcmp(args[i], "|")==0){
pipeCheck = i;
}
}
if (pipeCheck != 0){
args[pipeCheck] = NULL;
directPipe(args, pipeCheck, argCount, ampCheck);
}
}
} 這是我的程序管道的功能:
int directPipe(char ** args, int fileNumber, int argCount,int ampCheck){
int fd[2];
int child1,child2;
int status;
int i;
char * piped[10000];
int count = 0;
for (i = (fileNumber+1); args[i] != NULL; i++){
piped[count] = args[i];
count++;
}
piped[count] = NULL;
printf("\nPipe attempted...\n");
pipe(fd);
child1 = fork();
if (child1==0){
close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);
execvp(args[0], args);
printf("Unknown command, please try again.");
exit(0);
}
child2 = fork();
if (child2 ==0){
close(0);
close(fd[1]);
dup(fd[0]);
close(fd[0]);
execvp(piped[0], piped);
printf("Unknown command, please try again.");
exit(0);
}
close(fd[1]);
close(fd[0]);
if (ampCheck == 0){
while (wait(&status) != child1);
while (wait(&status) != child2);
}
else{
printf("\nampCheck = %d",ampCheck);
sigset(child2, printer());
}
return (0);
}
「控制權不會回傳給父母」---請告訴您觀察到的情況。 –
不清楚。什麼是函數參數。需要最少的main()來編譯完整的程序和指令來重現問題。 – grebneke
增加了一個主要的和固定的解釋 –