기본 콘텐츠로 건너뛰기

ftok

IPC ... Inter Process Communication. 뭐 말 그대로 프로세스끼리 말하는 통신하는 방식이다. IPC에는 여러가지 방식이 있겠지만, 일반적으로 메시지큐, 공유메모리, 세마포어 이 세가지를 읊곤 한다. (소켓도 IPC라고!) 내 머릿속에서 이러한 세가지 단어를 엎고 있는 단어가 있었으니 이름하야 'SysV'.

전화회사(AT&T)에서 1983년에 하드웨어 팔아먹으려고(스위치 용도일까?) 만든 OS가 있었으니, 이름하여 'System 5(SysV)'. 이게 큰 히트를 치면서 현대 UNIX 구조의 기초를 만들게 되었다. 이때 첫 버전인 'System 5 Release 1(SVR1)에서 이미 위에서 언급한 IPC I/F를 가지고 있었다. 참조:  http://en.wikipedia.org/wiki/System_V

오늘 알아볼(것도 없는) ftok 함수는 위에서 언급한 SysV의 IPC I/F에서 사용하는 key_t을 만들기 위한 것이다. 일단 IPC객체를 하나 얻어오려면 커널이 알아볼 수 있는 키가 필요하다. (리눅스에서 내놔야 int형이지만...) 이 키를 만드려면 ftok함수를 써서 만들어야하며, 인자는 파일패스와 8bit 프로젝트값이다. 이 두가지 인자로 커널이 알아볼 수 있는 키가 만들어지고, 이것을 통해 IPC객체를 커널에 등록하고, 프로세스와 연결할 수 있는 것이다.

사실 과거에서 지금까지 많이 쓰이는 유구한 전통이 있는 함수라고 하는데, 학교 다닐 때 한 두 번 써본 것이 전부다. 그래서 실은 저 키를 만드는 과정이나, 주의 사항도 써야겠지만 귀찮아서 그냥 RTFM...

SysV가 가진 IPC I/F가 잘못 만들어진 것은 아니지만, 개인 취향으로 POSIX가 새로 규정한 IPC I/F가 좀더 끌리기에 그것을 쓰고 있다. (장점 약간과 정리한 느낌을 주는 I/F 정도가 이유라면 이유랄까...)

다음에는 POSIX에서 규정한 IPC I/F를 소개할까 한다. (다만 국내외 문서에서 POSIX IPC I/F를 사용한 예를 찾기가 참담하다.)

댓글

이 블로그의 인기 게시물

Bash Array, Map 정리

Bash에서 Array, Map에 대한 정리. (매번 찾기 귀찮) 찾아보진 않았지만, Bash에서 Array든 Map이든 동일하게 Map(C++에서 Unordered Map)으로 동작하는 것 같다. 왜냐하면, Array의 Index가 연속하지 않아도 동작한다. 그저 Key가 0 이상의 정수인 Map이랑 비슷하게 동작한다. 예) 1, 2, 3, 9, 10 Array # 생성 declare -a empty_array declare -a ar=(haha hoho baba "long string haha hoho") # 접근 echo "ar[0]=${ar[0]}" echo "all as array=${ar[@]}" # 큰따옴표 안에서 각 원소를 따로따로 전달한다. echo "all as one=${ar[*]}" # 큰따옴표 안에서 각 원소를 문자열 하나로 합쳐 전달한다. echo "indexes=${!ar[@]}" echo "indexes=${!ar[*]}" echo "length=${#ar[@]}" echo "length=${#ar[*]}" echo "last=${ar[-1]}" echo "last=${ar[@]: -1}" # 콜론 뒤에 빈 칸이 꼭 필요하다. 옛 방식 # 현재 상황 declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]="long string haha hoho") ar[100]=hello # 인덱스를 건너 뛰어도 동작한다. declare -p ar #(출력) declare -a ar=([0]="haha" [1]="hoho" [2]="baba" [3]=&

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)