我在C中實現一個殼。這是我用於管道的功能。當我在代碼中放入「ls | a」(即用無效的命令來傳遞一個有效的命令)時,它並不像它應該退出子進程。我如何讓它回到主要功能? 同樣的事情發生時,我做PS | ls或ps |密碼等,但ls | ps的工作原理與bash相同。我知道ls | ps或ps | ls沒有道理,但至少他們應該給bash相同的輸出。管道在C殼執行
void exec3(char **args, char **args2){
int fd[2];
pid_t pid,pid1;
int status;
pipe(fd);
int e=0;
if ((pid = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if ((pid1 = fork()) < 0) {
printf("*** ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0 && pid1!=0){
printf("in 1\n");
close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);
if(execvp(args[0],args)<0){
printf("**error in exec");
close(fd[0]);
close(fd[1]);
exit(1);
}
//printf("exiting 1\n");
exit(0);
}
else if (pid1 == 0 && pid!=0) {
printf("in 2\n");
close(0);
dup(fd[0]);
close(fd[1]);
close(fd[0]);
if((e=execvp(args2[0],args2))<0){
printf("**error in exec2 ");
close(fd[0]);
close(fd[1]);
exit(1);
}
exit(0);
}
else {
close(fd[0]);
close(fd[1]);
fflush(stdout) ;
while (wait(&status) != pid);
while (wait(&status) != pid1);
}
}
讀一本好書就像http://advancedlinuxprogramming.com/和研究一些小的自由軟件的shell,比如'sash'的源代碼。 –
快問題:你是來自epitech嗎? :) – Intrepidd
錯誤消息屬於stderr。 '的printf(「ERROR ...'是*始終*錯了。'perror'是你的朋友。 –