리눅스에서 프로세스를 생성하는 과정을 알아보기 전에, 프로세스의 기본 구조를 다시 생각해보자.
프로세스의 기본 구조는 다음과 같다.
프로세스가 생성되면 위의 기본 구조를 갖추어 메모리에 할당되어 실행되고 프로세스는 다른 프로세스로부터 생성된다.
프로세스를 실행하는 시스템콜은 fork()
와 exec()
이 있다.
fork()
는 프로세스 안에서 fork 함수가 실행되면, fork 함수를 가지고 있던 프로세스(부모)를 복사해 자식 프로세스를 생성한다.
Before fork() call
이후부터 프로세스가 2개exec()
는 프로그램 실행파일을 읽어 현재 프로세스의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어 씌운다.
또한, exec()
는 내부에 6개의 함수를 가지고 있어 각기 다른 역할을 수행한다.
execl("/bin/ls", "ls", "-l, NULL)
"ls"
: argv[0]
=> 함수의 0번 인자, ls 명령을 실행"-l"
: argv[1]
=> 함수의 1번 인자, -l 옵션execlp()
execlp("ls", "ls", "-al", NULL)
execle()
execle("ls", "ls", "-al", NULL, envp)
execv(): execl()
에서 반환된 argv 사용
execv("/bin/ls", arg)
execvp(): execlp()
에서 반환된 argv 사용
execvp("ls", arg)
execve(): execle
에서 반환된 argv 사용
execve("ls", arg, envp)