나는 C로 셸을 구현하고 있습니다. 이것은 파이핑에 사용하는 함수입니다. "ls | a"를 코드에 넣으면 (예 : 유효하지 않은 명령으로 파이프를 파이프합니다), 자식 프로세스를 종료해야합니다. 어떻게하면 주요 기능으로 돌아 가게 할 수 있습니까? ps 할 때 똑같은 일이 발생합니다. 또는 ps | pwd 등등 그러나 ls | ps는 bash와 동일하게 작동합니다. 나는 ls를 안다. ps 또는 ps | 이해가 안되지만 적어도 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/과 같은 좋은 책을 읽고'sash'와 같은 작은 자유 소프트웨어 셸의 소스 코드를 연구하십시오. –
빠른 질문 : epitech 출신입니까? :) – Intrepidd
오류 메시지가 stderr에 속합니다. 'printor ("ERROR ...'는 * 항상 * 틀린 것입니다 ..'perror'는 당신의 친구입니다 –