핀토스 2주차는 핀토스 1주차와는 다른 의미로 혼돈의 주차였던 것 같다.
핀토스 1주차 때도 물론 처음 보는 내용을 다루는 것이라 쉽지는 않았지만
팀원들과 머리를 맞대고 논리적으로 접근하면 문제가 해결되고 뿌듯함도 느낄 수 있었다.
그런데 2주차는... 구현을 하면서 자꾸만 한계에 부딪혔던 주차였던 것 같다.
이번 주차도 저번 주차와 비슷하게 처음에 이론 공부를 시작으로 팀원들과 페어프로그래밍으로 운을 뗐는데, 중간 정도 구현한 다음부터는 구현할 내용들이 많아진 것도 있고, 새로운 방식으로 구현을 해보고자 각자 구현을 한 다음 하나의 코드로 합치기로 했다.
어느 정도 구현을 하다가... 고쳐도 고쳐도 고쳐지지 않는 에러를 발견했는데, 아무리 코드를 고치고 디버깅을 해도 고쳐지지 않아서 좌절을 하게 되는 경험을 하였다.
주변에 물어봐도 같은 에러가 발생한 케이스가 없어서 혼자서 해결할 수 밖에 없는 상황이었다.
결국에는 구현을 거의 다 마친 팀원과 코드를 뜯어본 다음에야 문제를 해결 할 수 있었는데,
문제의 원인이 너무 사소한 것이어서 허무했다.
쓰레드 헤더 파일 내부에 있는 쓰레드 구조체에
포인터로 선언하면 안되는 변수를 포인터로 선언해놓은 것이 문제의 원인이었다.
C언어에서는 변수 선언 하나에서도 엄청난 오류가 발생할 수 있다는 점을 간과했던 것 같다.(특히 포인터 관련된 부분은 더욱 조심하자...)
그래도 실만 있었던 것은 아니었다. 많은 오류 덕분에 gdb를 사용하는 디버깅 방식에 좀 더 익숙해질 수 있었고 다음에 비슷한 오류가 생기면 아마 더 빨리 원인을 찾을 수 있지 않을까 싶다.
내용적인 측면에서는 fork, wait, exec 등등의 함수를 구현하면서 프로세스가 자식 프로세스를 만들고 세마포어를 통해 우선권을 주고받는 과정을 배우면서 프로세스의 실행과정을 많이 배울 수 있었던 것 같다.
어쨌든, 어찌저찌 어려운 핀토스 2주차가 끝났다. 이제 또 어려운 핀토스 3주차를 맞이해야지.
반갑다 핀토스 3주차야~! 이번 주차도 힘내서 공부하려고 한다. 화이팅!!
아래는 전처리기 지시문 정리
전처리기 지시문은 소스 프로그램을 쉽게 변경하고
프로그램을 다른 실행 환경에서 컴파일하기 쉽게 하기 위해 사용한다.
#define identifier token-string(opt)
#define identifier (identifier(opt), ..., identifier(opt)) token-string(opt)
#define 명령어는 컴파일러가 소스 파일의 identifier의 각 항목을 token-string으로 대체하게 한다.
identifier가 주석에 있거나, 문자열에 있거나, 더 긴 identifier의 일부라면 교체되지 않는다.
PI를 항상 3.14라는 값을 넣은 변수로 사용하고 싶을 때,
#define PI 3.14 와 같은 식으로 선언해놓는다면, 실수로 PI=300 처럼 3.14가 아닌 값을 넣게 되는 일을 방지할 수 있다.
#ifdef identifier
#ifndef identifier
위 두 명령어는 아래와 같은 표현이다.
#if defined identifier
#if !defined identifier
.
#ifdef와 #ifndef 명령어는 #if가 쓰일 수 있는 곳이라면 쓸 수 있다.
.
.
.
#ifdef는 어떤 변수가 #define 되어있는지 알아보는 기능이다.
#ifdef identifier는 identifier가 정의되어있다면 #if 1과 같은 의미다.
반대로 정의되어있지 않다면 #if 0과 같은 의미이다.
#ifdef는 정의되어있는지를 테스트하므로, 한번에 여러개를 사용할 수는 없다.
즉, 형식이 #ifdef something 처럼 하나의 토큰으로 작성되어야한다.
여러개가 정의되어있는지 테스트 하기 위해서
#if defined(something1) || defined(something2) 처럼 사용할 수 있다.
#if something1 || something2 처럼 사용해도 된다.
ifndef는 내용이 정의되어 있지 않을 때 #endif까지를 유효한 소스코드로 인식하고 컴파일 시 적용하라는 의미다.
#if !defined(something)
(안의 내용은 유효코드)
#endif
반대로 #ifdef something 이라면
해당 키워드가 정의되어 있지 않으므로 #endif까지의 코드 내용은 전부 무의미해진다.
#ifdef something
(안의 내용은 무효)
#endif