개요
miniShell은 42Seoul에 들어와서 처음으로 C를 이용해서 진행한 큰 프로젝트였다.
miniShell은 bash의 기능을 그대로 구현을 해보는 프로젝트이다.
shell을 특징과 구현 방법에 대해서 이야기 해보자.
(오랜 시간 뒤의 회고라서 디테일이 떨어질 수 있습니다 ㅜㅜ)
구조 및 동작 순서

동작 순서를 간단하게 시각화해보았다.
먼저 shell에 명령어가 입력으로 들어오면 토큰화를 해준다. 토큰은 트리 형태로 파싱을 해주었다. 파이프만 사용하는 shell이라면 linked list 형태로 만들어도 괜찮지만, 보너스 파트인 &&, || 의 기능도 있는 shell이다보니 &&, ||을 처리하기 위해서는 트리 형태로 데이터를 저장하는 것이 정신 건강에 좋다.
토큰화가 완료된다면, 각 명령어를 실행시켜줄 process를 생성해준다. 왜 process를 생성해주는 걸까? 그 이유는 명령어를 실행시켜주는 함수인 execve는 실행하고 나서 실행된 프로세스가 종료되기 때문이다.
근데 또 주의할 점은 파이프이 기능은 왼쪽 명령어의 출력값을 오른쪽 명령어의 입력으로 넣어줘야하기 때문에 process간의 데이터를 공유할 수 있도록 해줘야한다. 따라서 pipe와 dup2를 이용해서 데이터를 공유하면 되는데 pipe 와 dup2 사용법을 알아보자.

pipe는 위 그림처럼 프로세스끼리 데이터를 공유할 수 있도록 해주는데 단방향으로만 데이터를 전달할 수 있다.
int pipe(int pipefd[2]) 함수에 int fd[2] 인자를 넣어주면 fd[1]는 파이프에 write를 해줄 수 있는 파일 디스크립터가 fd[0]에는 read를 할 수 있는 파일 디스크립터가 세팅된다.

그리고 dup2란, 파일 디스크립터가 가르키는 곳을 바꿔주는 함수는이다. 위 그림을 설명하면 dup2(infile, STDING_FILENO)를 하면 STDIN_FILENO인 0이 infile이 가르키는 파일을 가르키게 된다.
이 뜻은 무엇이냐면, dup2를 하기전에 write(0, "123", 3)을 했다면 표준입력에 123이 입력이 됐다면, dup2를 하고 나면 file1에 123이 기록이 된다.
그래서 우리는 위 pipe와 dup2를 이용해서 process끼리 데이터를 주고 받을 수 있도록 할 수 있다.

이런 식으로 각 프로세스의 표준 입려과 표준 출력 값을 pipe의 값들로 바꾸어서 서로 이어질 수 있도록 해주는 것이다.
위같은 아이디어들로 미니쉘 프로그램을 만들었다.
(에러가 발견된다면 댓글 부탁드립니다 ㅜㅜ)
'42seoul' 카테고리의 다른 글
[42Seoul] 식사하는 철학자들 (1) | 2024.02.01 |
---|---|
[42Seoul] Web Server 프로젝트 회고 (0) | 2024.01.29 |
[42Seoul] ft_transcendence 퐁 게임 프로젝트 회고 (1) | 2023.12.17 |
[42Seoul] Net_practice 문제풀이 (0) | 2023.07.13 |
[42Seoul] pipex (0) | 2023.07.02 |
개요
miniShell은 42Seoul에 들어와서 처음으로 C를 이용해서 진행한 큰 프로젝트였다.
miniShell은 bash의 기능을 그대로 구현을 해보는 프로젝트이다.
shell을 특징과 구현 방법에 대해서 이야기 해보자.
(오랜 시간 뒤의 회고라서 디테일이 떨어질 수 있습니다 ㅜㅜ)
구조 및 동작 순서

동작 순서를 간단하게 시각화해보았다.
먼저 shell에 명령어가 입력으로 들어오면 토큰화를 해준다. 토큰은 트리 형태로 파싱을 해주었다. 파이프만 사용하는 shell이라면 linked list 형태로 만들어도 괜찮지만, 보너스 파트인 &&, || 의 기능도 있는 shell이다보니 &&, ||을 처리하기 위해서는 트리 형태로 데이터를 저장하는 것이 정신 건강에 좋다.
토큰화가 완료된다면, 각 명령어를 실행시켜줄 process를 생성해준다. 왜 process를 생성해주는 걸까? 그 이유는 명령어를 실행시켜주는 함수인 execve는 실행하고 나서 실행된 프로세스가 종료되기 때문이다.
근데 또 주의할 점은 파이프이 기능은 왼쪽 명령어의 출력값을 오른쪽 명령어의 입력으로 넣어줘야하기 때문에 process간의 데이터를 공유할 수 있도록 해줘야한다. 따라서 pipe와 dup2를 이용해서 데이터를 공유하면 되는데 pipe 와 dup2 사용법을 알아보자.

pipe는 위 그림처럼 프로세스끼리 데이터를 공유할 수 있도록 해주는데 단방향으로만 데이터를 전달할 수 있다.
int pipe(int pipefd[2]) 함수에 int fd[2] 인자를 넣어주면 fd[1]는 파이프에 write를 해줄 수 있는 파일 디스크립터가 fd[0]에는 read를 할 수 있는 파일 디스크립터가 세팅된다.

그리고 dup2란, 파일 디스크립터가 가르키는 곳을 바꿔주는 함수는이다. 위 그림을 설명하면 dup2(infile, STDING_FILENO)를 하면 STDIN_FILENO인 0이 infile이 가르키는 파일을 가르키게 된다.
이 뜻은 무엇이냐면, dup2를 하기전에 write(0, "123", 3)을 했다면 표준입력에 123이 입력이 됐다면, dup2를 하고 나면 file1에 123이 기록이 된다.
그래서 우리는 위 pipe와 dup2를 이용해서 process끼리 데이터를 주고 받을 수 있도록 할 수 있다.

이런 식으로 각 프로세스의 표준 입려과 표준 출력 값을 pipe의 값들로 바꾸어서 서로 이어질 수 있도록 해주는 것이다.
위같은 아이디어들로 미니쉘 프로그램을 만들었다.
(에러가 발견된다면 댓글 부탁드립니다 ㅜㅜ)
'42seoul' 카테고리의 다른 글
[42Seoul] 식사하는 철학자들 (1) | 2024.02.01 |
---|---|
[42Seoul] Web Server 프로젝트 회고 (0) | 2024.01.29 |
[42Seoul] ft_transcendence 퐁 게임 프로젝트 회고 (1) | 2023.12.17 |
[42Seoul] Net_practice 문제풀이 (0) | 2023.07.13 |
[42Seoul] pipex (0) | 2023.07.02 |