리눅스의 모든 것이 파일로 이루어져 있습니다.
저희들이 사용하는 shell 명령어도 어떻게 보면 파일에 접근을 하여 실행이 됩니다.
PATH 환경 변수에 접근을 하여 해당 명령어를 실행할 수 있는 경로를 찾아서 shell 명령어를 실행해 줍니다.
예를 들어 ls 명령어를 예를 한번 들어보도록 하겠습니다.
whereis ls
"whereis ls"명령어를 통해 'ls'명령어가 어디서 실행이 되는지 알 수 있습니다.
'ls'명령어는 '/usr/bin/ls'에서 실행되는 것을 확인할 수 있습니다.
이렇게 뜬금없이 서론이 굉장히 길었습니다.
이제 execve함수에 대해 살펴보도록 하겠습니다.
execve
exec에 대해 먼저 알아야 할 필요가 있습니다.
exec는 입력된 파일의 경로에서 특정 명령어를 실행한 결과값을 출력해 주고 문제가 있는지 없는지를 판단하는 함수입니다.
이번 시간에는 execve에 대해서만 자세히 살펴보도록 하겠습니다.
그 외에 exec 계열의 함수가 궁금하시다면 한번 찾아보시는 것도 좋을 것 같습니다.
#include <unistd.h>
int execve(const char *pathname, char *const argv[], char *const envp[]);
pathname에 argv[]가 실행될 경로를 입력해 줍니다.
argv[]에 명령어를 입력해 줍니다.
envp[]는 환경 변수를 입력해 줍니다.
반환값은 성공 시 0을 실패 시 -1을 반환합니다.
위의 함수를 이용하여서 ls명령어를 실행해 보도록 하겠습니다.
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[], char *envp[])
{
char *command[3];
command[0] = "ls";
command[1] = "-al";
command[2] = NULL;
printf("execve before\n\n");
if (execve("/usr/bin/ls", command, envp) == -1)
return (0);
printf("execve after\n");
return (0);
}
(개인 정보로 인해..... main문의 출력값은 생략하도록 하겠습니다. )
실행해 보신 분들은 아시겠지만, "execve after"은 출력이 안 되는 것을 확인할 수 있습니다.
왜 그럴까요???
execve 함수의 원리
위에서 말씀드렸다시피 execve함수는 pathname, argv, envp를 인자로 입력받는다고 말씀을 드렸습니다.
여기서 pathname에 조금 집중할 필요가 있습니다.
pathname
pathname에서 argv 명령어가 실행될 경로를 입력받게 됩니다. 그러면 새로운 프로세스를 pathname에서 열어야 합니다. 현재 경로에서는 argv 명령어를 실행할 수 없기 때문입니다.
따라서 현재 main문의 프로세스를 pathname에서 새롭게 생성한 프로세스로 대체를 해줍니다. 그렇게 되면 execve함수 이후에 내용은 실행이 안되게 됩니다.
'Language > C언어' 카테고리의 다른 글
C058_헤더 파일 만들기 (0) | 2024.01.17 |
---|---|
C056_C언어에 환경 변수 사용하기 (1) | 2024.01.14 |
C055_pipe 함수 사용하기 (1) | 2024.01.13 |
C054_open 함수 사용하기 (0) | 2024.01.12 |
C053_dup2 함수 사용하기 (0) | 2024.01.11 |