어떻게 명령어를 실행하는가?
- 우리가 직접 명령어를 만드는 것은 아니다.
- 모든 명령어는 이진 파일의 형태로 특정한 폴더에 있다.
- 우리는 우리가 받은 명령어(
ls)를 해당 명령어가 있는 주소(/bin/ls)로 바꿔줌으로써 이 명령을 가져올 수 있다. - 이후
execve()함수를 통해 이를 실행시킨다.
옵션이 있다면 어떻게 해야 할까?
가령 ls -al을 실행하고 싶다고 치자. 이 경우에는 다음과 같이
c
execve("ls의 주소", ls -al, 환경변수);
첫 번째 인자 : 명령어의 절대 주소
두 번째 인자 : 입력된 명령
세번째 인자 : 환경변수
명령어 설정하기
- 받아온 argument vector 중 어디부터 어디까지가 명령어인지 확인
- 각 argument vector를 ft_split()을 이용해 잘라 이중 배열로 만들기
- 옵션이 들어가 있을 수 있으므로 ft_split()을 이용해야 함.
절대 주소 만들기
- 환경변수에서 “PATH=” 로 시작하는 문자열를 찾는다.
- 해당 문자열을 ft_split()을 이용해 이중 배열로 만든다.
- 받아온 명령어에 “/”를 붙인다.
- 이중 배열의 원소를 역슬래쉬 명령어와 계속 붙여본다.
- 붙인 뒤 access()를 통해 실제로 실행될 수 있는지를 본다.
- 실행 가능하다면 그것이 바로 해당 명령어의 절대주소.
환경변수는 다음과 같이 받아올 수 있다.
c
int main(int ac, char **av, char **env){...}
// env 변수 안에 환경변수가 담겨 있다.
파일 열기
open()을 이용해 infile과 outfile의 fd를 획득한다.
c
tools->infile_fd = open(tools->infile, O_RDONLY);
tools->outfile_fd = open(tools->outfile, \
O_RDWR | O_CREAT | O_TRUNC, 0644);