posix 메시지 큐 예제

posix 메시지 큐 예제

시스템 V 메시지 큐(msgget(2), msgsnd(2), msgrcv(2 등)는 프로세스 간에 메시지를 교환하기 위한 이전 API입니다. POSIX 메시지 큐는 System V 메시지 큐보다 더 나은 인터페이스를 제공합니다. 반면에 POSIX 메시지 큐는 시스템 V 메시지 큐보다(특히 이전 시스템에서) 덜 광범위하게 사용할 수 있습니다. 메시지 큐 구조는 헤더 파일에 있습니다. mq_open 호출이 성공하면 메시지 큐 설명자가 반환됩니다. 메시지 큐 설명자는 큐에 대한 후속 호출에 사용할 수 있습니다. 파일 시스템을 탑재한 후 일반적으로 파일에 사용되는 명령(예: ls(1) 및 rm(1))을 사용하여 시스템의 메시지 큐를 보고 조작할 수 있습니다. 이전 예제에서는 프로그램 내에서 System V 메시지 큐를 삭제하는 방법도 보여 줍니다. msgget(에서 반환된 메시지 큐 식별자를 사용 하 여) 메시지 큐는 두 번째 매개 변수로 IPC_RMID와 msgctl()를 호출 하 여 즉시 삭제 됩니다. 세 번째 매개 변수는 무시되고 NULL은 일반적으로 사용됩니다. POSIX 메시지 큐와 달리 시스템 V 메시지 큐를 삭제하면 큐와 모든 메시지가 즉시 삭제됩니다. 다른 프로세스가 큐를 사용하는 경우 msgsnd() 및 msgrcv()에 대한 후속 호출이 실패합니다. 따라서 System V 메시지 큐를 사용할 때 프로그램은 항상 msgsnd() 및 msgrcv()의 반환 값을 확인하고 오류를 적절하게 처리해야 합니다.

이제 송신 프로세스가 하나의 함수 호출로 100바이트를 모두 보냈다고 가정합니다. 프로세스가 파이프 또는 FIFO를 사용하고 수신기가 read()가 있는 50바이트만 요청하는 경우 해당 프로세스는 정확히 50바이트를 검색합니다. 그러나 메시지 큐를 사용하는 경우 바이트는 단일 메시지로 변환됩니다. 메시지 크기는 메시지 큐를 설정하는 데 사용되는 매개 변수에 따라 결정됩니다. 예를 들어 Linux의 POSIX 메시지 큐의 기본 메시지 크기는 8192바이트입니다. 수신 프로세스가 이보다 적게 요청하는 경우(예: 50바이트만 요청) 아무 것도 수신되지 않습니다. 메시지와 바이트 스트림의 차이를 무시하면 예기치 않은 오류가 발생할 수 있습니다. POSIX 메시지 큐를 가진 메시지를 보내는 것은 char 배열을 통해 이전에 보여 드린 것과 거의 정확하게 작동합니다. 유일한 차이점은 msg_ptr 포인터의 캐스팅이며 msg_len 매개 변수는 구조체의 크기를 기반으로 합니다. 마찬가지로 읽기와의 유일한 차이점은 구조체 유형에 msg_ptr을 캐스팅하는 것입니다. 메시지를 보내려고 하지만 모든 메시지 큐에 연결된 특성 구조가 있는 모든 메시지 큐를 차단하기 위한 최대 시간 제한(abs_timeout)을 지정합니다. 이 구조에는 물론 QNX 구현의 메시지 큐에는 명명된 파이프(QNX의 FIFPo)의 모든 장점이 있습니다.

먼저 msgtyp 매개 변수를 0으로 설정하여 선입순으로 메시지를 받을 수 있습니다. 수신된 메시지에는 구조체에 포함된 형식 정보가 있으므로 프로그램은 팩트 후 형식을 사용할 수 있습니다. 또는 msgtyp에 대해 양수 값을 전달하면 특정 형식이 있는 경우에만 메시지를 검색합니다. 해당 형식에 메시지가 없는 경우 msgrcv() 블록(기본 동작) 또는 즉시 반환 하 고 errno 전역 변수를 ENOMSG로 설정 합니다. mq 관리자는 POSIX 1003.1b 메시지 큐를 구현합니다. 큐를 만들면 /dev/mq 아래의 경로 이름 공간에 나타납니다. mqueue에 대한 경로 이름 공간과 는 다릅니다 – 큐는 /dev/mqueue 아래의 경로 이름 공간에 나타납니다. 다음 특수 클라이언트 함수는 mqueue 또는 mq와 통신합니다: 기본적으로 libc에서 mq_*() 루틴을 구현하는 것은 mqueue 서버를 사용하여 각 트랜잭션을 중개하는 전통적인 스타일입니다. mq_notify는 mqdes가 참조하는 빈 큐에 메시지가 도착했다는 비동기 알림을 등록하거나 등록 취소하기 위한 것입니다.