fork() 함수 사용시 결과 관련 질문
371
投稿した質問数 8
안녕하세요
다음의 소스코드를 실행 했을 시 ...
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;
}
추가 질문 있으시면 댓글 남겨주세요~
0
답변 감사합니다.
제공해 주신 코드를 실행했을 때, End of fork 가 한번 나타나는 것은 parent process 마친 후 에 출력한 것이고, child process 마치고는 exit(0)으로 종료해서 End of fork 가 나타나지 않는 것인가요?
inotify 객체에 등록된 watch descriptor 해제 관련 질문
0
37
2
select API 실습 코드 질문
0
40
2
wsl에서 fcntl사용
0
72
2
inotify_event 구조체 질문 [파일 이벤트 - 라이브 프로그래밍]에서...
0
180
2
./stat 파일이름
0
273
2
fopen r, r+모드 차이
0
460
2
강의를 모두 수강하고 스스로 구현하면 좋을 과제나 프로젝트 주제가 있을까요?
0
326
1
pthread 질문
0
419
2
I/O Multiplexing(select) 질문
0
325
1
inotify.c. ret 질문
0
302
1
inotify.c 질의합니다.
1
317
1
child process
0
715
1
read/blocking
0
564
1
flock
0
565
1
system call
0
598
1
pthread_create() 함수 이용했을 때, thread가 두번 호출되는 것 처럼 나타납니다. 왜 그런것인가요?
0
487
1
exec 관련 궁금한 사항
0
450
2
파일 디스크립터와 FILE 구조체에 대한 질문
0
552
1
buf 선언에 따른 read() fail 문제
0
251
2
파일 이벤트 - 라이브 프로그래밍 에서 캐스팅 질문
0
254
1
2번 multi thread 방법 질문
0
242
1
segmentation fault 발생 관련 문의
1
842
1
라이브 코딩 실습 코드
0
235
1
화면이 짤려요
0
549
4

