-
카테고리
-
세부 분야
시스템
-
해결 여부
미해결
fork() 함수 사용시 결과 관련 질문
22.11.28 16:23 작성 조회수 208
0
안녕하세요
다음의 소스코드를 실행 했을 시 ...
child process 에서 who 명령 실행 했을 때 ..
마지막에 새로운 프롬프트가 안 뜬 상태로 되는거죠?
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
pid_t pid;
switch (pid = fork()) {
case -1 : /* fork failed */
perror("fork");
exit(1);
break;
case 0 : /* child process */
printf("--> Child Process\n");
if (execl("/usr/bin/who", "who", (char *)NULL) == -1) {
perror("execl");
exit(1);
}
exit(0);
break;
default : /* parent process */
printf("--> Parent process\n");
break;
}
printf("End of fork\n");
return 0;
}
답변을 작성해보세요.
0
ProgCoach4U
지식공유자2022.11.30
안녕하세요. smile2000님
질문 글에 올려주신 코드를 컴파일해 실행해보면 말씀하신 것처럼 프롬프트가 제대로 안뜬 듯 보입니다. 이 현상은 fork() 후 parent가 먼저 종료된 후 프롬프트가 뜬 후 child가 who를 실행하고 종료되면서 프롬프트가 안뜬 것처럼 보이는 현상입니다. fork() 후 서로 할 일을 하고 프로그램이 종료되어 버렸기 때문에 누가 먼저 끝날지는 알 수 없게 됩니다. child보다 parent가 먼저 죽게 되면 child process는 고아 프로스세가 됩니다. 프로세스의 종료 순서상 좋은 순서는 아니죠.
fork() 후 child의 실행이 끝나길 기다리며면 wait() 계열의 API를 사용하셔야 합니다. 아래 코드는 waitpid()의 호출을 추가한 것입니다. pid 값을 비교하기 편하게 출력 부분도 조금 수정되어 있습니다. 코드 참조하셔서 비교해보시면 좋을 것 같습니다.
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/wait.h>
int main() {
pid_t pid;
pid_t child_pid;
int state;
printf("my pid is %d\n", getpid());
switch (pid = fork()) {
case -1 : /* fork failed */
perror("fork");
exit(1);
break;
case 0 : /* child process */
printf("--> Child Process. my pid is %d\n", getpid());
if (execl("/usr/bin/who", "who", (char *)NULL) == -1) {
perror("execl");
exit(1);
}
exit(0);
break;
default : /* parent process */
printf("--> Parent process. child pid is %d\n", pid);
child_pid = waitpid(-1, &state, 0);
printf("--> child process %d is done with exit status %d\n",
child_pid, WEXITSTATUS(state));
break;
}
printf("End of fork\n");
return 0;
}
추가 질문 있으시면 댓글 남겨주세요~
smile2000
질문자2022.11.30
답변 감사합니다.
제공해 주신 코드를 실행했을 때, End of fork 가 한번 나타나는 것은 parent process 마친 후 에 출력한 것이고, child process 마치고는 exit(0)으로 종료해서 End of fork 가 나타나지 않는 것인가요?
답변 1