linux queue 예제
컴파일하려면 프로그램에 헤더 파일이 포함되어야 합니다. 이 헤더 파일은 /usr/include 디렉토리에서 찾을 수 있습니다. mq_timedreceive는 시간 시간을 나타내는 추가 매개 변수가 있다는 점을 제외하면 mq_receive와 동일합니다. 큐에 대한 O_NONBLOCK 플래그가 활성화되지 않고 큐가 비어 있는 경우 mq_timedreceive는 abs_timeout으로 가리키는 시간의 발생 시 반환됩니다. 위에서 언급했듯이 abs_timeout이 가리키는 시간은 1970년 1월 1일, 00:00:00 +0000 UTC 이후의 초 및 나노초 수로 지정된 절대 시간입니다. POSIX 메시지 큐를 사용하면 여러 판독기와 기록기가 있는 효율적인 우선 순위 기반 IPC 메커니즘을 사용할 수 있습니다. 숙련된 POSIX 프로그래머의 경우 이 설명은 명명된 파이프의 이미지를 호출합니다. 그러나 파이프와 메시지 큐 간에는 몇 가지 근본적인 차이점이 있습니다. 리눅스 시스템의 경우 다음과 같은 전제 조건: 프로세스 간 통신 메시지 큐는 커널 내에 저장되고 메시지 큐 식별자로 식별되는 메시지의 연결된 목록입니다.
새 큐가 만들어지거나 msgget()에 의해 열린 기존 큐가 만들어집니다. 새 메시지는 msgsnd()에 의해 큐의 끝에 추가됩니다. 모든 메시지에는 양수 긴 정수 형식 필드, 음수가 아닌 길이 및 실제 데이터 바이트(길이에 해당)가 있으며, 모두 메시지가 큐에 추가될 때 msgsnd()에 지정됩니다. 메시지는 msgrcv()에 의해 큐에서 가져옵니다. 메시지를 선착순으로 가져올 필요가 없습니다. 대신 해당 형식 필드에 따라 메시지를 가져올 수 있습니다. 그림: 서버와 두 클라이언트를 보여주는 스크린샷은 Linux의 터미널에서 실행됩니다. 네 번째 터미널은 /dev/mqueue 디렉터리에서 서버 및 클라이언트 큐에 대한 파일을 표시합니다.
메시지 큐에 특정한 API를 사용하려면 프로그램이 /usr/lib 디렉터리에서 mqueue 라이브러리와 연결되어야 합니다. 이 라이브러리 파일에는 이러한 호출에 대한 클라이언트 측 스텁이 포함되어 있습니다. 컴파일러가 라이브러리를 찾을 수 있도록 컴파일 명령에 다음을 추가합니다. 유일한 위험은 이 예제에서 거의 발생하지 않는 전체 큐로 인해 전송 실패가 발생할 수 있다는 것입니다. 아래 수신기 프로그램은 IPC_NOWAIT 플래그를 사용하여 메시지를 수신합니다. mqueue 예제는 메시지 큐에 쓰는 보낸 자와 이 큐에서 읽는 수신자인 두 개의 프로그램으로 구성됩니다. 두 프로그램 모두 아래에 표시된 헤더 파일 queue.h를 포함합니다. 또한 QNX 구현을 사용하면 다음과 같은 표준 I/O 및 파일 조작 호출을 메시지 큐에서 사용할 수 있습니다. 발신자 프로그램은 msgsnd를 호출하여 메시지를 보내고 수신자는 msgrcv를 호출하여 메시지를 검색합니다.
이 예에서 보낸 사람은 1-1-2-2-3-3 순서로 메시지를 보내지만 수신자는 메시지 큐가 엄격한 FIFO 동작에 바인딩되지 않음을 나타내는 순서 3-1-2-1-3-2로 메시지를 검색합니다. 위의 기능만 지원합니다.