드디어 대망의 프로세스 관련 시스템 콜이다..! 앞에서 소개했던 파일 입출력 관련 시스템 콜은 거의 래핑 함수 위주여서 구현이 어렵지는 않았던 반면, 프로세스 관련 시스템 콜들은 구현할 양도 앞의 포스팅에 비해 많은 편이고 무엇보다도 개념 자체가 쉽게 와닿지 않아 많이 어려웠다고 느꼈다. 프로세스와 관련된 시스템 콜은 fork, exit, exec, wait 으로 총 네 가지가 있다. 이 파트가 특히 어려웠던 점은, 네 개의 시스템 콜 중 하나라도 제대로 구현이 되어있지 않으면 거의 모든 프로세스 시스템 콜 테스트가 통과되지 않아 네 개를 모두 구현하고 나서야 결과를 확인할 수 있었다는 점이다. 구현할 양도 꽤나 많은 편이라 네 개를 모두 구현하고 나서 문제가 생기면 그 문제를 찾기가 꽤나 힘들어진다....
핀토스 프로젝트 2의 시작은 시스템 콜부터다. 사실상 argument passing은 몸풀기... 문제는 몸풀기 수준이었던 argument passing조차도 쉽지만은 않았다는 거..! 이번 포스팅에서는 시스템 콜 중에서 파일 입출력과 관련된 시스템 콜들을 다뤄볼 예정이다. 저번에 웹 프록시 서버를 구현할 때 소켓을 파일로 추상화하여 소켓에게도 파일 디스크립터가 붙었는데, 이번에도 파일 디스크립터 개념을 사용한다. 파일 디스크립터와 관련해서는 다뤘던 포스팅이 있으니 참고하자. https://codable.tistory.com/19 [Computer System] File Descriptor File Descriptor 유닉스 시스템에서는 많은 것들을 파일로 관리한다. 정규 파일들뿐만 아니라 디렉터리, 소..
핀토스 프로젝트 2는 유저 프로그램에 관한 과제다. 첫 번째 프로젝트는 모두 커널 영역에서 진행이 되었다.(이거 덕분에 나름 디버깅이 편했던 편...) 두 번째 프로젝트는 크게 두 가지 파트로 나뉘는데, 이번 포스팅에서는 그 첫 번째를 다뤄보고자 한다. Argument Passing 첫번째로 argument passing이다. 우리가 함수를 사용할 때, 함수에 인자를 넘겨주는 방식을 구현하는 과제다! 우리가 인자를 함수로 넘겨줄 때 스택에 넣어두었다가 함수에 진입하고 나면 스택에서 argument를 꺼내 사용한다. 예를 들어 다음과 같은 코드가 있다고 생각해보자. void add(int a, int b) { printf("%d\n", a + b); } 위의 add 함수는 인자로 a와 b를 넘겨받고, 각각..