다음 C 프로그램에서:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void){
char *shell = getenv("SHELL");
execl(shell, NULL, NULL);
perror("execl() failed");
}
위의 코드를 실행하면 새 셸이 나타납니다. 새 셸에 들어가면 exit
다시 이전 셸로 돌아갑니다.
execl()
현재 쉘을 새 쉘로 교체하면 안 되나요 (그리고 이전 쉘 내부에 새 쉘이 생성되지 않음)?
(리눅스 4.16)
답변1
execl()
현재 쉘을 새 쉘로 교체하면 안 되나요 (그리고 이전 쉘 내부에 새 쉘이 생성되지 않음)?
이는 셸이 아닌 프로그램을 실행하는 프로세스인 현재 프로세스를 대체합니다.
프로그램을 시작하면 프로세스 트리는 다음과 같습니다.
old shell → your program
프로그램이 을 호출하면 execl()
해당 트리는 다음과 같습니다.
old shell → new shell
따라서 셸을 종료하면 이전 셸로 돌아갑니다.
기존 쉘을 교체하려면 기존 쉘에 새 프로그램으로 교체하라고 지시해야 합니다.
exec ./yourprogram
그러면 프로그램이 새 쉘로 교체되고 사용자는 이전 쉘을 새 쉘로 교체하게 됩니다(프로그램과 관련된 추가 단계).