posix 메시지 큐 예제

POSIX 메시지 큐의 기본 동작은 전체 큐에 쓸 때(또는 빈 큐에서 읽기) 차단 I/O를 수행하는 것입니다. 이 동작이 바람직하지 않은 경우 사용할 수 있는 세 가지 대안이 있습니다. 첫 번째는 비차단 모드에서 큐를 여는 oflag 비트 마스크에 O_NONBLOCK 옵션을 포함하는 것입니다. 큐가 가득 차면 mq_send()가 차단 하지 않고 오류를 반환 합니다. 다른 옵션은 추가 매개 변수(abs_timeout)를 사용하여 차단될 때 기다릴 수 있는 최대 시간을 지정하는 mq_timedsend() 및 mq_timedreceive()를 사용하는 것입니다. 마지막으로 전송되지 않은 메시지를 검색하는 대신 mq_notify()를 사용하여 메시지가 전송되었다는 비동기 알림을 요청할 수 있습니다. 관심 있는 독자는 이러한 기능에 대한 자세한 내용은 언어 설명서를 참조해야 합니다. POSIX 메시지 큐를 설정하고 사용하는 데 일반적으로 사용되는 6가지 함수가 있습니다. 이 코드는 큐에서 메시지 수를 가져오려고 시도합니다(fstat()를 사용하지 마십시오): 메시지 큐를 사용하면 구조화된 메시지를 교환하여 프로세스가 통신할 수 있습니다. 파이프 및 FIFPo와 마찬가지로 프로세스는 메시지 큐가 별도의 메시지에서 데이터를 교환하기 위해 IPC 모델을 전달하는 메시지를 따를 수 있습니다. 그러나 메시지 큐는 여러 가지 중요한 방법으로 파이프와 다릅니다.

msg_ptr은 메시지 버퍼를 가리킵니다. msg_len은 메시지의 크기이며 큐의 메시지 크기와 같아야 합니다. msg_prio는 메시지 우선 순위이며 메시지의 우선 순위를 지정하는 음수가 아닌 숫자입니다. 메시지는 메시지 우선 순위의 감소 순서로 큐에 배치되며, 우선 순위에 대한 이전 메시지는 새 메시지 앞에 옵니다. 큐가 가득 차면 메시지 큐에 대해 O_NONBLOCK 플래그가 활성화되지 않는 한 큐에 공간이 있을 때까지 mq_send 블록이 차단되며, 이 경우 mq_send는 errno를 EAGAIN로 설정하여 즉시 반환됩니다. mq_receive는 설명자 mqdes에서 참조하는 큐에서 메시지를 수신합니다. 가장 높은 우선 순위의 가장 오래된 큐에서 삭제 하 고 msg_ptr에 의해 가리키는 버퍼의 프로세스에 전달 됩니다. msg_len은 바이트의 버퍼 길이이며 큐의 최대 메시지 크기인 mq_msgsize 특성보다 커야 합니다. 포인터 msg_prio가 null이 아닌 경우 수신된 메시지의 우선 순위가 가리키는 정수에 저장됩니다.

mq_receive의 기본 동작은 큐에 메시지가 없는 경우 차단하는 것입니다. 그러나 큐에 대해 O_NONBLOCK 플래그가 활성화되고 큐가 비어 있는 경우 mq_receive는 errno를 EAGAIN로 설정한 상태에서 즉시 반환됩니다. 성공시 mq_receive는 msg_ptr로 가리키는 버퍼에서 수신된 바이트 수를 반환합니다. 메시지 큐 구조는 헤더 파일에서 찾을 수 있습니다. mq_timedsend는 큐가 가득 찼고 O_NONBLOCK 플래그가 지정되지 않은 경우 abs_timeout 및 mq_timedsend 반환을 가리키는 시간에 시간 시간이 발생한다는 점을 제외하면 mq_send처럼 작동합니다. 시간 매개 변수는 1970년 1월 1일, 00:00:00 +0000 UTC 이후의 절대 시간 및 나노초입니다. 또한 큐가 가득 찼고 지정된 시간이 이미 경과한 경우 mq_timedsend가 즉시 반환됩니다. 시간 제한을 지정하는 구조는 세마포 및 공유 메모리와 같은 메시지 큐에는 두 가지 인터페이스 사양이 있습니다: POSIX 및 System V. Newer 응용 프로그램은 특히 시스템 V의 제한으로 인해 POSIX 인터페이스를 사용하는 경향이 있습니다. 사양. 두 버전의 메시지 큐 간의 주요 차이점은 다음과 같습니다: POSIX 메시지 큐를 가진 메시지 보내기는 char 배열과 이전에 표시된 것과 거의 정확하게 작동합니다. 유일한 차이점은 msg_ptr 포인터의 캐스팅이며 msg_len 매개 변수는 구조체의 크기를 기반으로 합니다.

마찬가지로 읽기와의 유일한 차이점은 구조체 유형에 msg_ptr을 캐스팅하는 것입니다.