fork

wait

waitpid

execve

fork와 exec


exec로 호출되는 프로그램은 현재 메모리에 올라와 있는 프로그램을 덮어서 로딩된다.

별도의 메모리 공간을 할당하고 그 할당된 공간에서 exec를 실행하게 되면 다른 메모리 공간에서 실행되고 있는 원레의 프로세스는 자기 일을 할 수가 있다. 이런 일을 해주는 것이 fork이다.

fork

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int	main()
{
	pid_t pid;

	printf("Before the fork()\\n");
	pid = fork();

	if (pid == 0)
		printf("This is a Child. PID = %d\\n", pid);
	else if (pid > 0)
		printf("This is a Parent. PID = %d\\n", pid);
	else
		printf("Fork is failed!!\\n");
}

위 프로그램에서 pid = fork()가 시행되는 순간, 위 프로세스와 똑같은 프로세스 하나가 별도의 메모리 공간에 생성된다. 이 때 두 프로세스의 변수 값, PC(Program Count) 값은 정확히 똑같다. 다만 pid 값만 유일하게 달라진다.

따라서 pid 값을 이용해 Child Process가 할 일을 하게 하고, Parent Process가 할 일을 하게 하면 된다.

exec

exec는 어떤 일을 하게 하는 family 명칭이다.

exec family가 하게 하는 일은 현재 실행되는 프로세스에서 다른 프로세스 일을 하게 하는 것이다.

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("executing ls\\n");

	execl("/bin/ls", "ls", "-l", (char *) 0);
	perror("execl failed to run ls");
	exit(1);
}

exec family는 다른 Process를 실행시킬 때 현재 Process 메모리 공간에 덮어 써 버린다. 따라서 exec 함수가 성공하면 perror는 실행되지 않는다. 이미 ls -l 프로세스가 메모리 공간에 덮어 써 버려졌고, 이후 명령들은 찾을 수 없기 때문이다. 그러나 exec가 실패했다면 ls -l 프로세스가 메모리 공간에 로딩되어지지 않기 떄문에 perror가 실행 될 것이다.