fork()하고나서 child process가 종료된후 프로그램 흐름이 이상
글쓴이: shiefra / 작성시간: 일, 2004/10/24 - 1:05오후
/* shell.c */ while (1) { i=0; printf("[%s]", prompt); // prompt 출력 while ((ch=getchar()) != '\n') { command[i] = ch; i++; } command[i] = '\0'; // command : user input . . . switch(..) { . . case general : cmdGeneral(); break; } clearString(); } // end of while
/* general.c */ void cmdGeneral (void) { int pid; if (complexCMD==0) { pid = fork(); if (pid<0) { fprintf(stderr, "Fork Failed"); exit(-1); } else if (pid==0) { // Chile process execlp (arg[0], arg[0], NULL); } else // Parent process wait(NULL); } }
shell.c 에서 명령을 입력받아서, switch로 구분한 뒤에
각각 해당 함수를 호출하는 구조입니다.
입력으로 man등을 넣으면 cmdGeneral()이 호출되어서
general.c의 코드에서 처럼 fork를 해서 execlp()함수로
man을 실행하게 되고, 잘 됩니다.
그런데 입력으로 asdf같은 틀린 명령어를 넣으면,
cmdGeneral()이 호출되고, execlp()함수로 실행한 뒤에
에러메세지가 출력되고 shell.c로 돌아와야 할것 같은데
에러메세지도 출력되지 않고, shell.c로 돌아온 후의 흐름도
이상해집니다.
switch에서 빠져나간후 clearString()을 수행하고 다음 루프로
들어가는게 제 생각인데,
printf("[%s]", prompt); // prompt 출력
이거를 수행하고나서 clearString()을 수행하고 다음 루프로
들어갑니다.
그래서 ls, exit 이런 순서로 입력하면 shell에서 빠져나오는데
asdf, exit를 입력하면 안빠져나옵니다.
(exit 입력후에 clearString()이 호출되버려서..)
다음 입력부터는 흐름에 이상이 없습니다.
제 생각에는 잘못된 명령에 대한 에러메세지가 나오지 않은것과
관련이 있을것 같은데, 제 속 좀 풀어주세요 (__)
Forums:
[code:1]/* general.c */void cmdGener
exec()가 성공하면 child는 새로운 프로그램의 main()을 시작하고, 실패하면 exec() 다음 문장을 수행합니다...
게으름은 이제 그만
아 .. 그렇군요
고맙습니다, 수정해주신대로 컴파일해보니
제대로 동작하네요 ^^
댓글 달기