• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

fork() 함수 사용시 결과 관련 질문

22.11.28 16:23 작성 조회수 203

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;

}

 

답변 1

답변을 작성해보세요.

0

안녕하세요. 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님의 프로필

smile2000

질문자

2022.11.30

답변 감사합니다.

제공해 주신 코드를 실행했을 때, End of fork 가 한번 나타나는 것은 parent process 마친 후 에 출력한 것이고, child process 마치고는 exit(0)으로 종료해서 End of fork 가 나타나지 않는 것인가요?