fork가 어떻게 프로세싱 되는지 실습을 해보았다.
hello.c 파일
/*
* A file executed by child process
*
*/
#include <unistd.h>
#include <stdio.h>
int main(void)
{
do {
printf("I'm hello. I'm alive!\n");
sleep(5);
} while (1);
}
fork3.c 소스코드 및 설명
/*
* Fork a child process and execute a new program code.
*
*/
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
int pid, status;
char *arg[] = { "./hello", NULL } ;
charch;
pid = fork();
if (pid > 0) {
/* parent process */
printf("PARENT: Child pid = %d\n", pid);
waitpid(pid, &status, 0);
printf("PARENT: Child exited.\n");
} else {
/* child process */
printf("CHILD: Child process image will be replaced by %s\n", arg[0]);
execv(arg[0], arg);
}
}
실행결과 설명
(각 출력이 나오는 시점, 자식프로세스 종료 후 동작 등)
*arg에 ./hello를 저장하게 넣는다.
부모가 생성되면 if(pid>0)문이 실행되고 printf("PARENT: Child pid = %d\n", pid);
와 printf("PARENT: Child exited.\n");가 실행된다. 그리고 자식프로세스가 실행 되어 printf("CHILD: Child process image will be replaced by %s\n", arg[0])가 출력되고, execv함수로 인하여 *arg에 들어있는 ./hello를 실행된다. 자식프로세스가 종료되면waitpid(pid, &status, 0);가 실행되어 printf("PARENT: Child exited.\n");
를 출력하고 종료한다.
fork4.c 소스코드 및 설명
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>
#include <stdio.h>
int main ( void )
{
int pid, status;
char *arg [ ] = { "./hello", NULL };
char ch;
do {
pid = fork ( );
if ( pid > 0 ) {
/* parent process */
printf ( "PARENT : Child pid = %d\n", pid );
waitpid ( pid, &status, 0 );
printf ( "PARENT : Child exited.\n" );
} else {
/* child process */
printf ( "CHILD : Child process image will be replaced by %s\n", arg [ 0 ] );
execv ( arg [ 0 ], arg );
}
} while ( 1 );
}
코드설명
while(1)문을 통해 일단 1번은 실행시킵니다. 여기서 child pid를 kill 한다고 해도, 다시 do while(1)이 실행되어 다시 자식 프로세스를 생성합니다. 따라서 자식 프로세스는 항상 1개가 실행되어있습니다.
실행결과 설명
fork()를 생성했으니 자식 프로세스가 생성되고, 무조건 pid는 0보다 크니까 printf ( "PARENT : Child pid = %d\n", pid );를 출력해주고, printf ( "CHILD : Child process image will be replaced by %s\n", arg [ 0 ]);를 출력한다. 그 후 execv ( arg [ 0 ], arg );를 통해 ./hello를 불러와 계속 실행시킨다. 자식프로세스가 종료되면 waitpid ( pid, &status, 0 );가 실행되어 프로그램이 멈춘다. 하지만, do while(1)문을 사용하였기 때문에 다시 fork를 통해 자식 프로세스가 생성되어 반복 된다. 따라서 계속 자식 프로세스가 1개 이상 상주할 수 있게 된다.
'혼자 공부하는 것들 > 운영체제' 카테고리의 다른 글
[운영체제] 스레드(Thread) + 실습을 통해 직접 깨우치기! 프로세스와의 차이점? (2) | 2020.09.28 |
---|---|
[운영체제] 프로세스 상태 +실습을 통해 직접 깨우치기! (0) | 2020.09.28 |
[운영체제] fork 실습 -1 (0) | 2020.09.27 |
[운영체제] system call (0) | 2020.09.27 |
[운영체제] CPU 모드 관찰 (0) | 2020.09.27 |
댓글