mq_notify 예제

예제 프로그램이 처음 실행될 때 출력은 다음과 같이 되어야 합니다. 알림 인수는 보낼 알림을 정의하는 시그이벤트 구조를 가리킵니다(있는 경우). struct sigevent는 signal.h 헤더에 정의되어 있습니다. mq_notify – sevp가 NULL이 아닌 포인터인 경우 mq_notify() 호출 프로세스를 등록하여 메시지 알림을 수신합니다. sevp 포인트가 알림을 수행하는 방법을 지정하는 sigevent 구조의 sigev_notify 필드입니다. 이 필드에는 다음 값 중 하나가 있습니다: mq_notify는 mqdes가 참조하는 빈 큐에 메시지가 도착하는 비동기 알림을 등록하거나 등록 취소하는 것입니다. int mq_notify(mqd_t mqdes, const struct sigevent *알림); 알림은 한 번 발생합니다: 알림이 배달된 후 알림 등록이 제거되고 다른 프로세스가 메시지 알림에 등록할 수 있습니다. 알림 프로세스가 다음 알림을 수신하고자 하는 경우 mq_notify()를 사용하여 추가 알림을 요청할 수 있습니다. 큐에서 읽지 않은 모든 메시지를 비우기 전에 이 작업을 수행해야 합니다.

(비차단 모드로 큐를 배치하면 비워지면 차단하지 않고 메시지 큐를 비우는 데 유용합니다.) 알림이 NULL이 아닌 경우 mq_notify()는 메시지가 지정된 메시지 큐에 도착할 때 알림을 받을 호출 프로세스를 등록합니다. 메시지가 큐에 도착하면(즉, 큐가 더 이상 비어 있지 않음) 지정된 알림이 호출 프로세스로 전송됩니다. 메시지 큐에서 알림을 위해 한 번에 하나의 프로세스만 등록할 수 있습니다. 지정된 메시지 큐에서 알림에 등록된 프로세스(호출 프로세스 포함)가 완료되면 해당 큐에 대한 추가 등록 시도가 실패합니다. 아래 예제에서는 Linux에서 POSIX 메시지 큐를 사용하여 서버와 클라이언트 간의 프로세스 간 통신을 보여 줍니다. 서버는 항공편의 좌석 번호또는 이와 유사한 토큰 번호를 관리합니다. 요청 시 클라이언트에 토큰 번호를 제공하는 것은 서버의 작업입니다. 일반적인 시나리오에서는 서버에 토큰 번호를 요청하는 클라이언트가 여러 개 있을 수 있습니다. 서버의 메시지 큐 이름은 클라이언트에 알려져 있습니다. 각 클라이언트에는 서버가 응답을 게시하는 자체 메시지 큐가 있습니다.

클라이언트가 요청을 보내면 해당 메시지 큐 이름을 보냅니다. 서버는 클라이언트의 메시지 큐를 열고 응답을 보냅니다. 클라이언트는 메시지 큐에서 응답을 선택하고 해당 클라이언트의 토큰 번호를 읽습니다. 프로세스 아키텍처는 다음과 같습니다. 프로그램이 빈 큐에 쓴 후 큐가 비어 있는 큐에서 비빈으로 전환되었다는 신호가 표시되었습니다. 예제 프로그램이 두 번째로 실행될 때 다음이 생성되어야 합니다: 메시지 알림은 새 메시지가 도착하고 큐가 이전에 비어 있을 때만 발생합니다. mq_notify()가 호출될 때 큐가 비어 있지 않은 경우 큐가 비워지고 새 메시지가 도착한 후에만 알림이 발생합니다. mq 서버는 각 mq_send()/mq_receive()/mq_notify() 작업에 관여하지 않지만 서버는 큐 이름을 유지하고 해당 커널 메시지 큐를 만들어야 합니다. 관리 목적으로 ls 및 rm을 사용할 수도 있지만 셸 유틸리티를 사용하여 큐 내용을 조작할 수는 없습니다.

예를 들어 이제 fcntl() 대신 mq_setattr()를 사용하여 열린 메시지 큐의 비차단 특성을 수정해야 합니다.