현재 쉘을 execl()로 교체하십시오.

현재 쉘을 execl()로 교체하십시오.

다음 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

그러면 프로그램이 새 쉘로 교체되고 사용자는 이전 쉘을 새 쉘로 교체하게 됩니다(프로그램과 관련된 추가 단계).

관련 정보