shell 구현하면서 알게된것과 여러가지 체크 포인트

두명이서 순수하게 100시간정도 썼다. 소요기간 약 4주 여기 내용가지고는 부족하니 직접 더 필요한 부분은 구글에 man 으로 검색해서 직접 읽어볼 것

환경변수

main의 경우 인자를 두개를 형으로 할 수 있는 줄알았는데 환경변수를 추가로 받아오는 방법이 있었다. int main(argc argv envp)를 통해서 를 받아 올 수 있다.

리다이렉션 fd 처리

쉘은 어떤 파일로부터 읽고, 어떤 파일로 출력을 할 수 있게하는 리다이렉션을 지원한다. 이걸 어떻게 처리하냐면 stdin, stdout의 fd 0, 1을 직접 파일에다가 연결하는 식으로 한다. dup2로 구현할 수 있다.

프로세스

일반적으로 프로세스를 실행하기 위해서는 기본적으로

  1. fork를 통해 현재 프로세스를 복제해서 새로만듬
  2. execve를 통해서 외부 프로그램 실행

fork 없이 execve를 하면 현재 프로세스에서 그대로 외부 프로그램을 실행하기에 다시 되돌아올 수 없다. fork를 할때 파일 스트림은 유지가 부모로부터 상속받는다. 자세한것은

재미있는 점은 OS에서도 같은 방식으로 프로세스를 새로 실행시킨다.

execve

우리가 사용하던 많은 명령어들은 명령어 그 자체가 하나의 실행 프로그램 이었다.

ls -al 은 알고보면 ./a.out arg1 과 같다.

main에서 받아온 환경변수 PATH에(여기에 추가가되었든 없어졌든):로 경로에 실행되는지 여부를 판단하면서 실행한다.

signal 세팅, 메모리 할당등 대부분을 것들은 싹 초기화한다. 자세한것은

여담 : copy on write

fork해서 malloc을 한것을 읽을 때 이게 그대로 남아있는가를 찾아보다 알게 된 정보 운영체제가 fork를 할때 모든 부분에 새로 메모리 할당을 하는 것이아닌 해당 메모리를 write하려고할때 할당을 하는 방식으로 최적화를 하는 방법이다.