part 1 - libc 함수 직접구현
- 함수는 원본과 동일한 프로토타입 및 기능을 수행해야 한다. (man page 참조)
- 직접 재 정의한 a함수들은 실제 libc 함수와 성능적인 차이는 많이난다.
part 2 - 문자열 함수구현
- 문자열 관련 함수
Bonus - List구현
- LinkedList와 유사하다. 동일하다고는 볼 수 없다.
- 특정 데이터 삭제시(ft_lstdelone) link가 유지되지 않는다.
printf함수 구현하기
- 서식문자 [cspdiuxX%] 구현
- flag [-0.*] 구현
Bonus
- 서식문자 [nfge] 구현 => nf 구현, ge는 안함.
- flag [# +] 구현
- 길이 [l ll h hh] 구현
배운점
- printf 구조 이해하기.
- 가변인자 사용하기.
- 컴퓨터에서 실수를 표현하는 방법(부동 소수점 표현방식)
- Bankers's Rounding
개행단위로 파일을 읽기
- read함수 이해하기. (buf에 fd의 내용을 BUFFER_SIZE만큼 읽는다.)
- static 키워드 이해하기.
wordpress를 동작시키는 컨테이너를 자동화하여 실행할 수 있도록 DockerFile 작성하기.
- os => debian:buster
- web-server => nginx
- dbms => mariadb(mysql)
- CGI기능을 쓰기위한 프로그램 => php7.3-fpm
- php랑 mysql이랑 연동하는 프로그램 => php-mysql
어셈블리 코드작성하기
- 64bit 어셈블리 코드를 intel문법 사용
- 기본 함수 구현하기
stack 2개로 정렬하기
- 요구하는 stack명령어를 최소로 사용해야 함
- pa, pb => push기능 => ex) pa는 a스택 top의 데이터를 b스택 top으로 push 함
- sa, sb => swap기능 => ex) sa는 a스택 최상위 데이터2개를 swap 함
- ra, rb => 위로 한칸씩 올리기 => ex) ra는 a스택 모든데이터의 위치를 한칸씩 위로 올림, 최상단 데이터는 최하단으로 감
- rra, rrb => 아래로 한칸씩 내리기 => ex) rra는 a스택 모든데이터의 위치를 한칸씩 아래로 내림, 최하단 데이터는 최상단으로 감
unix pipe명령어 구현하기
- 파이프를 사용한 IPC(Inter-Process Communication)
- fork, wait, dup, pipe, execve함수 사용
식사하는 철학자 문제 - 교착 상태 해결하기
thread와 mutex를 활용하여, 상호배제 구현하기
- thread는 자원을 공유한다. 공유되는 자원 들(상태가 변경되거나, 참조되는)을 mutex를 통해 상호배제 한다
- 종료를 알리는 공유자원의 flag가 변경될 때, 모든 쓰레드를 종료한다.
- 모든 쓰레드가 종료되었는지 확인하기 위해 동기화기법 모니터를 사용한다. 이는 N개의 철학자의 상태를 N개의 모니터에서 관리한다.
- 뮤텍스는 lock과 unlock함수를 통해 상호배제 한다.
process와 semaphore를 활용하여, 상호배제 구현하기
- process는는자원을 복사한다. 따라서 finish쓰레드를 추가적으로 구현한다.
- 종료를 monitor쓰레드에서 종료플레그를 알리는 세마포어가 +1이 되는 경우, 모든 프로세스를 강제로 kill해준다.
- 세마포어는 wait를 통해 세마포어를 -1감소, post를 통해 +1 증가한다. (따라서 세마포어 생성시 초기 값을 정수로 함께 전달한다.)
- 세마포가 1이상의 값이 될때까지 기다린다.
Bash 만들기
셸 & 콘솔 & 터미널
- 셸은 명령어를 OS에 전달하고 결과를 전달받는 프로그램.
- Shell은 운영체제 상에서, 다양한 운영체제 기능과 서비스를 사용하기 위한 인터페이스이다.
- 셸(껍데기)는 [ 사용자 <-> 운영 체제의 내부(커널) ] 사이의 인터페이스를 감싸는 층이기 때문에 이러한 이름이 붙었다.
구현 기능
- 콘솔에 입력받기. (readline, add_history 함수 사용)
- 입력 문자를 파싱 (1) => [|, &&, ||] 단위로 현재 line이 총 몇개의 명령어 실행을 의미하는지 ?
- 입력 문자를 파싱 (2) => special characters를 처리한다, [', ",
$] quotation이 닫혀있는지, $ 의경우는 환경변수를 확인하여 변환해 준다. 환경변수는 main함수의 3번째 인자로 char *envp[]를 받아서 처리한다. - 입력 문자를 파싱 (3) => [<, >, <<, >> ] redirection 및 heredoc 기호를 구분하여, 입 출력 파이프를 변경해주어야 할게 있는지 ?
- 입력 문자를 파싱 (4) =>입력 된 명령어의 프로그램이 존재하는지 ?, 환경변수 PATH를 활용하여 확인.
- 리다이렉션 처리 및, 명령어 수행. fork -> dup2 -> execve
- 호출 실행결과의 종료 상태를 exit함수로 전달 함.
- builtin함수[echo, cd, pwd, env, export, unset, exit] 구현