mq_timedreceive 예제


POSIX 메시지 큐의 기본 동작은 전체 큐에 쓸 때(또는 빈 큐에서 읽기) 차단 I/O를 수행하는 것입니다. 이 동작이 바람직하지 않은 경우 사용할 수 있는 세 가지 대안이 있습니다. 첫 번째는 비차단 모드에서 큐를 여는 oflag 비트 마스크에 O_NONBLOCK 옵션을 포함하는 것입니다. 큐가 가득 차면 mq_send()가 차단 하지 않고 오류를 반환 합니다. 다른 옵션은 추가 매개 변수(abs_timeout)를 사용하여 차단될 때 기다릴 수 있는 최대 시간을 지정하는 mq_timedsend() 및 mq_timedreceive()를 사용하는 것입니다. 마지막으로 전송되지 않은 메시지를 검색하는 대신 mq_notify()를 사용하여 메시지가 전송되었다는 비동기 알림을 요청할 수 있습니다. 관심 있는 독자는 이러한 기능에 대한 자세한 내용은 언어 설명서를 참조해야 합니다. 다음으로, 우리는 mq_receiving 및 mq_timed수신 메시지 수신에 대 한 호출을 가지고 있습니다. 완료되면 mq_receive() 및 mq_timedreceive() 함수는 선택한 메시지의 길이를 바이트로 반환하고 메시지는 큐에서 제거됩니다. 그렇지 않으면 큐에서 메시지가 제거되지 않으며 함수는 -1 값을 반환하고 오류를 나타내기 위해 errno를 설정해야 합니다. 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()의 반환 값을 확인하고 오류를 적절하게 처리해야 합니다. 아래 예제에서는 Linux에서 POSIX 메시지 큐를 사용하여 서버와 클라이언트 간의 프로세스 간 통신을 보여 줍니다. 서버는 항공편의 좌석 번호또는 이와 유사한 토큰 번호를 관리합니다.

요청 시 클라이언트에 토큰 번호를 제공하는 것은 서버의 작업입니다. 일반적인 시나리오에서는 서버에 토큰 번호를 요청하는 클라이언트가 여러 개 있을 수 있습니다. 서버의 메시지 큐 이름은 클라이언트에 알려져 있습니다. 각 클라이언트에는 서버가 응답을 게시하는 자체 메시지 큐가 있습니다.

Contact Info

Citizens for Yarbrough

1001 S. 17th Ave

Maywood, IL

Phone : (708) 344-7062

Email :