열렬히.뛰기

파싱하기

école 42 > pipex > pipex : 진행 상황 > 파싱하기

어떻게 명령어를 실행하는가?

  • 우리가 직접 명령어를 만드는 것은 아니다.
  • 모든 명령어는 이진 파일의 형태로 특정한 폴더에 있다.
  • 우리는 우리가 받은 명령어(ls)를 해당 명령어가 있는 주소(/bin/ls)로 바꿔줌으로써 이 명령을 가져올 수 있다.
  • 이후 execve() 함수를 통해 이를 실행시킨다.

옵션이 있다면 어떻게 해야 할까?

가령 ls -al을 실행하고 싶다고 치자. 이 경우에는 다음과 같이

c
execve("ls의 주소", ls -al, 환경변수);

첫 번째 인자 : 명령어의 절대 주소

두 번째 인자 : 입력된 명령

세번째 인자 : 환경변수

명령어 설정하기

  • 받아온 argument vector 중 어디부터 어디까지가 명령어인지 확인
  • 각 argument vector를 ft_split()을 이용해 잘라 이중 배열로 만들기
    • 옵션이 들어가 있을 수 있으므로 ft_split()을 이용해야 함.

절대 주소 만들기

  1. 환경변수에서 “PATH=” 로 시작하는 문자열를 찾는다.
  2. 해당 문자열을 ft_split()을 이용해 이중 배열로 만든다.
  3. 받아온 명령어에 “/”를 붙인다.
  4. 이중 배열의 원소를 역슬래쉬 명령어와 계속 붙여본다.
    • 붙인 뒤 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);