Blog

Real Estate and Mortgage Blog

mq_timedreceive 예제

mq_timedreceive는 시간 시간을 나타내는 추가 매개 변수가 있다는 점을 제외하면 mq_receive와 동일합니다. 큐에 대한 O_NONBLOCK 플래그가 활성화되지 않고 큐가 비어 있는 경우 mq_timedreceive는 abs_timeout으로 가리키는 시간의 발생 시 반환됩니다. 위에서 언급했듯이 abs_timeout이 가리키는 시간은 1970년 1월 1일, 00:00:00 +0000 UTC 이후의 초 및 나노초 수로 지정된 절대 시간입니다. 이전 예제에서는 프로그램 내에서 System V 메시지 큐를 삭제하는 방법도 보여 줍니다. msgget(에서 반환된 메시지 큐 식별자를 사용 하 여) 메시지 큐는 두 번째 매개 변수로 IPC_RMID와 msgctl()를 호출 하 여 즉시 삭제 됩니다. 세 번째 매개 변수는 무시되고 NULL은 일반적으로 사용됩니다. POSIX 메시지 큐와 달리 시스템 V 메시지 큐를 삭제하면 큐와 모든 메시지가 즉시 삭제됩니다. 다른 프로세스가 큐를 사용하는 경우 msgsnd() 및 msgrcv()에 대한 후속 호출이 실패합니다. 따라서 System V 메시지 큐를 사용할 때 프로그램은 항상 msgsnd() 및 msgrcv()의 반환 값을 확인하고 오류를 적절하게 처리해야 합니다. POSIX 메시지 큐의 기본 동작은 전체 큐에 쓸 때(또는 빈 큐에서 읽기) 차단 I/O를 수행하는 것입니다. 이 동작이 바람직하지 않은 경우 사용할 수 있는 세 가지 대안이 있습니다. 첫 번째는 비차단 모드에서 큐를 여는 oflag 비트 마스크에 O_NONBLOCK 옵션을 포함하는 것입니다. 큐가 가득 차면 mq_send()가 차단 하지 않고 오류를 반환 합니다.

다른 옵션은 추가 매개 변수(abs_timeout)를 사용하여 차단될 때 기다릴 수 있는 최대 시간을 지정하는 mq_timedsend() 및 mq_timedreceive()를 사용하는 것입니다. 마지막으로 전송되지 않은 메시지를 검색하는 대신 mq_notify()를 사용하여 메시지가 전송되었다는 비동기 알림을 요청할 수 있습니다. 관심 있는 독자는 이러한 기능에 대한 자세한 내용은 언어 설명서를 참조해야 합니다. 나는 mq_timedreceive와 함께 제대로 작동하는 방법을 찾을 수 없습니다, 사람이 나에게 예를 줄 수 있습니까? 완료되면 mq_receive() 및 mq_timedreceive() 함수는 선택한 메시지의 길이를 바이트로 반환하고 메시지는 큐에서 제거됩니다. 그렇지 않으면 큐에서 메시지가 제거되지 않으며 함수는 -1 값을 반환하고 오류를 나타내기 위해 errno를 설정해야 합니다. 다음 예제에서는 큐에서 메시지를 검색하기 위한 표준 방법을 보여 줍니다. 메시지를 수신하기 위한 msg_len 매개 변수는 특별한 주의가 필요합니다. mq_send()에 이 매개 변수를 사용하는 것은 직관적이며 write() 및 strncpy(와 같은 함수의 동작)와 일치합니다: msg_len은 전송될 msg_ptr로 식별된 문자열의 최대 문자 수를 지정합니다. 그러나 메시지를 받을 때 msg_len 메시지의 크기와 일치 해야 합니다.

따라서 표준 접근 방식은 mq_getattr()을 사용하고 반환된 구조mq_attr의 mq_msgsize 필드에 액세스하는 것입니다. 다음으로, 우리는 mq_receiving 및 mq_timed수신 메시지 수신에 대 한 호출을 가지고 있습니다. 아래 예제에서는 Linux에서 POSIX 메시지 큐를 사용하여 서버와 클라이언트 간의 프로세스 간 통신을 보여 줍니다.