본문 바로가기
혼자 공부하는 것들/운영체제

[운영체제] fork 실습 -2

by applepick 2020. 9. 27.
반응형

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 pidkill 한다고 해도, 다시 do while(1)이 실행되어 다시 자식 프로세스를 생성합니다. 따라서 자식 프로세스는 항상 1개가 실행되어있습니다.

 

실행결과 설명

fork()를 생성했으니 자식 프로세스가 생성되고, 무조건 pid0보다 크니까 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개 이상 상주할 수 있게 된다.

 

반응형

댓글