CS/시스템 프로그래밍

프로세스 생성(exec)

:_: 2022. 3. 2. 16:22

 

exec() 시스템콜

 

exec() 실행이 되면 새로운 프로세스를 만들지 않고 현재 프로세스 공간을 exec안에 인자로 실행파일 이름/인자 등을 넣어준다. 해당 프로세스 공간에 덮어 씌운다.  (TEXT, DATA, BSS 영역을 덮어씌운다.)

새로운 실행파일처럼 동작을 한다.

 

exec() 시스템콜 family

execvpe 가 아니라 execve

 

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가 순차적으로 실행이 되서 자식 프로세스가 생성이 된다. 이것이 리눅스의 프로세스 생성 방식이다.

 

 

 

 

제로베이스 컴퓨터 공학 전공자 따라잡기 강의 정리한 내용입니다.
728x90