리눅스 메시지큐 예제

자세한 내용은 더 나은 조정의 “POSIX.4 메시지 대기열”을 참조하십시오: 실제 프로그래밍의 메시지, 공유 메모리 및 동기화 장 – BILL O. Gallmeister의 POSIX.4 (O`Reilly & Associates, Inc. ISBN: 1-56592-074-0). 시스템 V 메시지 큐는 ftok 함수 호출을 사용하여 얻은 키를 사용하여 식별됩니다. POSIX 메시지 큐는 이름 문자열을 사용하여 식별됩니다. Linux에서 POSIX 큐는 정방향 슬래시(/)로 시작하여 하나 이상의 문자로 시작하는 문자열로 지정되며, 그 중 어느 것도 슬래시가 아니라 null 문자로 끝납니다. 큐 이름을 알고 적절한 권한이 있는 모든 프로세스는 큐에서 메시지를 보내거나 받을 수 있으며 다른 작업도 수행할 수 있습니다. 그림: 서버와 두 클라이언트를 보여주는 스크린샷은 Linux의 터미널에서 실행됩니다. 네 번째 터미널은 /dev/mqueue 디렉터리에서 서버 및 클라이언트 큐에 대한 파일을 표시합니다. 리눅스에서 POSIX 메시지 큐를 사용하는 프로그램은 컴파일러 옵션 -lrt를 사용하여 실시간 라이브러리, 리버트와 연결해야합니다.

함수 호출 이름은 접두사 mq_로 시작합니다. 필수 구성 조건 : 프로세스 간 통신 메시지 큐는 커널 내에 저장되고 메시지 큐 식별자로 식별된 메시지의 연결된 목록입니다. 새 큐가 만들어지거나 msgget()에 의해 열린 기존 큐가 만들어집니다. 새 메시지는 msgsnd()에 의해 큐의 끝에 추가됩니다. 모든 메시지에는 양수 긴 정수 형식 필드, 음수가 아닌 길이 및 실제 데이터 바이트(길이에 해당)가 있으며, 모두 메시지가 큐에 추가될 때 msgsnd()에 지정됩니다. 메시지는 msgrcv()에 의해 큐에서 가져옵니다. 메시지를 선착순으로 가져올 필요가 없습니다. 대신 해당 형식 필드에 따라 메시지를 가져올 수 있습니다. 아래 예제에서는 Linux에서 POSIX 메시지 큐를 사용하여 서버와 클라이언트 간의 프로세스 간 통신을 보여 줍니다.

서버는 항공편의 좌석 번호또는 이와 유사한 토큰 번호를 관리합니다. 요청 시 클라이언트에 토큰 번호를 제공하는 것은 서버의 작업입니다. 일반적인 시나리오에서는 서버에 토큰 번호를 요청하는 클라이언트가 여러 개 있을 수 있습니다. 서버의 메시지 큐 이름은 클라이언트에 알려져 있습니다. 각 클라이언트에는 서버가 응답을 게시하는 자체 메시지 큐가 있습니다. 클라이언트가 요청을 보내면 해당 메시지 큐 이름을 보냅니다. 서버는 클라이언트의 메시지 큐를 열고 응답을 보냅니다. 클라이언트는 메시지 큐에서 응답을 선택하고 해당 클라이언트의 토큰 번호를 읽습니다. 프로세스 아키텍처는 다음과 같습니다. mq_send는 설명자 mqdes에서 참조하는 큐에 메시지를 보내기 위한 것입니다. msg_ptr은 메시지 버퍼를 가리킵니다. msg_len은 메시지의 크기이며 큐의 메시지 크기와 같아야 합니다.

msg_prio는 메시지 우선 순위이며 메시지의 우선 순위를 지정하는 음수가 아닌 숫자입니다. 메시지는 메시지 우선 순위의 감소 순서로 큐에 배치되며, 우선 순위에 대한 이전 메시지는 새 메시지 앞에 옵니다. 큐가 가득 차면 메시지 큐에 대해 O_NONBLOCK 플래그가 활성화되지 않는 한 큐에 공간이 있을 때까지 mq_send 블록이 차단되며, 이 경우 mq_send는 errno를 EAGAIN로 설정하여 즉시 반환됩니다. 서버 및 클라이언트 프로그램은 -lrt 옵션으로 컴파일해야 합니다. 먼저 서버가 실행됩니다. 그런 다음 테스트를 위해 하나 이상의 클라이언트를 실행할 수 있습니다. 각 큐에 대해 파일은 /dev/mqueue 디렉터리(Linux)에서 만들어집니다. (4) 수신 및 원산지 프로세스에 대한 메시지 레이블지정.

mq_open 호출이 성공하면 메시지 큐 설명자가 반환됩니다. 메시지 큐 설명자는 큐에 대한 후속 호출에 사용할 수 있습니다. 물론 QNX 구현의 메시지 큐에는 명명된 파이프(QNX의 FIFPo)의 모든 장점이 있습니다.

Comments are closed.