기본 콘텐츠로 건너뛰기

라벨이 ipc인 게시물 표시

POSIX messagequeue

POSIX IPC에서 마지막-IPC는 이것 외에도 많다-으로 소개할 녀석은 메시지큐 이다. 간략히 뭐하는 녀석인지 설명하자면, ' 우선순위가 있는 줄서기 '랄까? 일단 Queue라는 말에서 이 녀석은 기본으로 먼저 던져넣은 메시지를 먼저 꺼내올 수 있다. 근데 가끔씩 긴급해 보내야할 메시지가 있을 수도 있을까...해서 메시지에 우선순위를 둘 수 있다. 그래서 때에 따라 우선순위가 높은 녀석이 나중에 큐에 들어갔는데도 먼저 나올 수 있다. 뭐 이런 녀석이다. 이 역시 SysV에서 뛰쳐나온 녀석이라서 SysV용 API가 있다. msgget으로 메시지큐 핸들을 얻어내어, msgsnd/msgrcv 등으로 적당히 메시지를 던지고 받을 수 있다. 이때 우선순위는 정수형으로 줄 수 있다. 다 사용한 메시지큐는 msgctl로 정리하여 OS에 반환할 수 있다. SysV 메시지큐 설명 끝. 역시나 내가 보고자 했던 것은 POSIX API. SysV 메시지큐 개념을 그대로 POSIX API에도 마련하였다. 메시지큐를 먼저 커널에 등록해야할 것이다. 이것은 이미 누누히 봤듯이 *_open 함수가 해줄 것 같다. 이 역시 mq_open함수가 그 일을 해준다. mqd_t mq_open(const char* name, int oflag, mode_t mode, struct mq_attr* attr); 뭐...뭔가 길다!? 반환값이 int가 아니라 mqd_t이긴 하지만, mqd_t 또한 int이다. 에러가 발생하면 (mqd_t)-1 을 반환한다. name, oflag, mode는 open함수 인자와 동일하다. name은 기존 shm_open, sem_open처럼 '/'로 시작하는 메시지큐 이름을 적는다. oflag에는 O_*로 시작하는 플래그를 OR연산으로 넣는다. oflag에 O_CREAT가 없으면 mode, attr 인자는 무시한다. mode는 파일을 생성할 때 접근제어이다. attr을 알아보기 위해 struct mq_attr을 살펴보자. struct mq...

POSIX semaphore

POSIX 함수에 대해 글 쓴 지가 너무 오래 전이라 까맣게 잊고 있었다. 오늘은 두서 없이 세마포어 라는 놈을 건들여보도록 하자. 일단 세마포어 하면 유명한 예제가 있다. 철학자라는 것들이 가서 포크랑 나이프랑 한 벌 씩 더 가져오면 해결할 수 있는 문제를 굳이 앉아서 남이 썼던 것 더럽게 씻지도 않고 빌려쓰고... 암튼 그런 드러운 문제를 해결하기 위해 세마포어가 탄생했다...라고 하는데 드럽긴 마찬가지고 좀 그렇다. 세마포어 개념은 안드로메다 같은 곳에서 찾아보길 바란다. 그래도 귀찮은 사람은 세마포어를 들어갈 수 있는 사람 수를 한정한 매점(PX?)이라고 생각해도 좋을 것이다. '세마포어 값'은 매장에 들어갈 수 있는 사람 수 여분을 뜻한다. 일단 세마포어도 SysV에서 뛰쳐나온 IPC개념 인데, 일전에 알아봤던 것 과 비슷한 API를 제공한다. semget, semop, semctl 이 바로 그것인데, 역시나 유명한 녀석이라 자세한 설명은 생략한다. 대충 semget으로 커널에 세마포어 객체 만들어달라고 떼를 쓴 뒤에 semop을 통해 세마포어 값 을 증감하고, semctl을 통해 커널에 세마포어 객체 파괴하여 정리하는 역을 한다. 이 역시 IPC이므로 명시적으로 세마포어 객체를 커널에서 제거하지 않으면 리부팅할 때까지는 커널자원을 차지한다. - 설명 끝 - 이번에도 SysV는 별 관심사는 아니고, 세마포어 개념 을 거의 그대로 가져온 POSIX API가 있다. 아, 그전에 미리 설명해야할 것이 있는데, 세마포어에도 이름이 있는 녀석(named-) 이 있고, 없는 녀석(unnamed-) 이 있다. 뭐더게 이름 있고 없는 녀석을 만들었는지는 각자가 판단해야할 것 같지만, 보통 이름이 있는 녀석은 세마포어를 만든 녀석과 그것을 공유하고 싶은 녀석끼리 별 관련 없을 때 사용하고, 이름 없는 녀석은 동일 프로세스 내 쓰레드끼리 또는 부모자식 같은 관계가 있을 경우에만 공유해서 사용하고 싶을 때 사용한다. 이름이 있냐 없냐 따라 생성 및 해체 ...

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 I...