프로세스 생성(exec)
exec() 시스템콜
exec() 을 실행이 되면 새로운 프로세스를 만들지 않고 현재 프로세스 공간을 exec안에 인자로 실행파일 이름/인자 등을 넣어준다. 해당 프로세스 공간에 덮어 씌운다. (TEXT, DATA, BSS 영역을 덮어씌운다.)
새로운 실행파일처럼 동작을 한다.
exec() 시스템콜 family
execl() 와 execlp() 시스템콜 사용법
→ default 로 대부분 bin이 path로 설정되어 있으므로
execlp 첫번째 인자는 디폴트로 설정되어 있는 환경변수 path값을 참조해서 실행파일을 실행하므로 파일이름만
execle() 시스템콜의 사용법
→ execle 은 execlp 의 NULL 인자 까지는 똑같다.
맨 마지막에 string 변수가 들어간다. string 변수를 미리 선언해줘야 한다.
string 변수는 환경변수를 따로 설정해야 한다.
실행파일에 환경변수들은 무한대로 넣어줄 수 있다.
마지막에 NULL 로 끝나야 한다. ( (char *) 0 이 null 이다.)
( execlp 가 path 를 가지고와서 실행. execl 은 환경변수 사용x )
execv(), execvp(), execve() 시스템콜 사용법
정리
execlp() 는 환경 변수를 보고 실행파일을 실행. 전체 디렉토리명까지 넣어줄 필요 없다.
execl() 는 파일명을 전체경로 포함 넘겨준다.
execle() 는 환경변수를 포함해서 별도로 환경변수값들을 미리 설정해서 특별하게 넣어줘야한다.
V와 l의 차이는 인자를 변수로 설정해서 넣어주겠냐, 아니면 직접써주겠냐의 차이이다.
execl() 시스템콜의 예
1. execl() 시스템콜을 실행시킨 프로세스 공간에 새로운 프로세스 이미지를 덮어씌우고, 새로운 프로세스를 실행
2. perror() 함수가 호출된다는 의미는 새로운 프로세스 이미지로 덮어씌우는 작업이 실행되지 못했다는 의미
→ 즉, execl()시스템콜 실행 실패
fork()와 exec()
- 리눅스 프로세스 실행
1. 부모 프로세스로부터 새로운 프로세스 공간을 만들고 부모 프로세스 데이터 복사(fork)
2. 새로운 프로세스를 위한 바이너리를 새로운 프로세스 공간에 덮어씌움(exec)
왜 두개를 나눴을까?
fork와 exec가 순차적으로 실행이 되서 자식 프로세스가 생성이 된다. 이것이 리눅스의 프로세스 생성 방식이다.
제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.