개발👩‍💻/시스템프로그래밍

프로세스 다루기 1(10-4)

gigibean 2021. 6. 5. 23:37
728x90

fork와 exec를 함께 사용하기

일반적으로 exec이 홀로 쓰이는 경우는 매우 드물다. 보통 fork와 함께 쓰인다.

프로세스가 있는데 그 프로세스가 포크를 불러서 자식프로세스를 만든다 자식 프로세스는 부모 프로세스와 똑같은 프로세스 생성, exec 불러서 다른 프로그램으로 바뀐다. 이런식으로 부모, 자식 프로세스가 전혀 다른 프로그램을 실행하도록 하는 유닉스 내의 방법

 

int main()
{
	pid_t pid;
	printf("hello!\n");
	if ((pid = fork()) > 0) { /* parent process */
		printf("parent\n");
		sleep(1);
	}
	else if (pid == 0) { /* child process */
		printf("child\n");
		execl("/bin/ls", "ls", "-l", NULL);
		printf("fail to execute ls\n");
	}
	else printf("parent : fail to fork\n");
	printf("bye!\n");
}

포크하기전에 hello를 출력하고 포크를 한다. 부모와 자식을 리턴 값을 이용해 담는다.

자식 프로세스를 만드는데 실패하면 fail을 알린다.

부모프로세스는 parent라고 출력을 하고 1초를 sleep 시킨다.

 

자식프로세스는 부모와 독립적으로 child라는 내용 출력하고 exec으로 ls라는 프로그램으로 바꾼다. 그리고 그 프로그램이 실행되게 된다. 실행결과가 또 나오고, exec 성공적으로 되었으므로 아무런 값을 반환하지 않고 fail exec은 출력하지 않는다.

$ ./ex07-07
hello!
parent
child
-rwxr-xr-x 1 usp student 13856 Oct 25 15:56 ex07-07
bye! 

 

exec() 전에 open되어 있는 파일은 exec() 후에도 계속 open되어 있다.

 

반응형