message queue 예제

message queue 예제

Uncategorized -

큐는 줄의 시작 부분에서 순차적으로 처리되기를 기다리는 줄입니다. 메시지 큐는 응용 프로그램 간에 전송되는 메시지 큐입니다. 여기에는 처리되기를 기다리는 작업 개체의 시퀀스가 포함됩니다. msqid는 msgget()에서 반환되는 메시지 큐 식별자입니다. 포인터 msgp는 큐에 넣을 데이터에 대한 포인터입니다. msgsz는 큐에 추가할 데이터의 바이트 크기입니다(mtype 멤버의 크기를 계산하지 않음). 마지막으로 msgflg을 사용하면 몇 가지 선택적 플래그 매개 변수를 설정할 수 있습니다. 메시지 큐는 비동기 통신 프로토콜을 제공하므로 메시지의 보낸 사람과 수신자가 동시에 메시지 큐와 상호 작용할 필요가 없습니다. 큐에 배치된 메시지는 받는 사람이 큐를 검색할 때까지 저장됩니다. 메시지 큐에는 단일 메시지로 전송될 수 있는 데이터 크기와 큐에서 미해결 상태로 유지될 수 있는 메시지 수에 대한 암시적 또는 명시적 제한이 있습니다. 프로그램 6.4로 표시된 클라이언트 프로그램은 PID를 획득하여 시작합니다.

이 값은 나중에 서버에 전송된 메시지를 표시하여 특정 클라이언트 프로세스에서 오는 것으로 식별하는 데 사용됩니다. ftok 라이브러리 함수는 키를 생성하는 데 사용됩니다. 클라이언트 프로세스가 호출될 때 아직 존재하지 않는 경우 메시지 큐를 만들려고 합니다. 또한 서버 프로세스가 없는 경우 클라이언트가 서버 프로세스를 시작하기를 원합니다. 메시지 큐가 없는 경우 서버 프로세스도 존재하지 않는다고 가정합니다. 이를 위해 19번 줄의 mid=msgget(키, 0)에 대한 초기 호출을 테스트하여 호출이 실패했는지 확인합니다. 메시지 큐를 찾을 수 없는 경우(호출실패) msgget 에 대한 두 번째 호출에 의해 메시지 큐가 만들어집니다. 이 경우 클라이언트 프로세스는 자식 프로세스를 포크하고 서버 프로세스를 실행하기 위해 exec에 대한 호출로 오버레이합니다. 서버는 명령줄을 통해 메시지 큐 식별자를 전달합니다. 모든 명령줄 인수는 문자열이기 때문에 sprintf 문자열 함수는 메시지 큐 식별자를 올바른 형식으로 넣는 데 사용됩니다. 프로그램이 언젠가 또는 다른 시간에 큐를 정리하도록 할 수 있으므로 후자의 선택이 가장 적합한 경우가 많습니다. 이렇게하려면 다른 기능인 msgctl()을 도입해야 합니다.

해적을 잡기 위해 위에서 만든 대기열이 있다고 가정해 봅시다. 위의 두 예제 모두에서 받는 사람 중 하나가 충돌한 경우 정보를 보낸 사람이 기다려야 하는 것은 의미가 없습니다. 일반적인 메시지 큐 에 있는 구현에서 시스템 관리자는 메시지 큐 에 있는 소프트웨어(큐 관리자 또는 브로커)를 설치하고 구성하고 명명된 메시지 큐를 정의합니다. 또는 메시지 대기열 서비스에 등록합니다. UNIX SYS V는 연결된 목록의 배열을 메시지 큐로 유지하여 메시지 전달을 구현합니다. 각 메시지 큐는 배열의 인덱스로 식별되며 고유한 설명자가 있습니다. 지정된 인덱스에는 여러 개의 설명자가 있을 수 있습니다. UNIX는 메시지 전달 기능에 액세스하는 표준 기능을 제공합니다. [7] 분리된 시스템의 한 프로세스가 큐에서 메시지를 처리하지 못하는 경우 다른 메시지는 큐에 계속 추가되고 시스템이 복구될 때 처리될 수 있습니다. 메시지 큐를 사용하여 처리를 지연시킬 수도 있습니다. 생산자는 큐에 메시지를 게시합니다.

지정된 시간에 수신자가 시작되고 큐에서 메시지를 처리합니다. 큐에 대기된 메시지를 저장 및 전달할 수 있으며 메시지가 처리될 때까지 메시지를 다시 배달할 수 있습니다. “뭐야?! 하나의 바이트 배열만 메시지 큐에 넣을 수 있습니까?! 가격대비 괜찮은 호텔” 정답이 아닙니다. 첫 번째 요소가 긴 경우 큐에 메시지를 넣을 모든 구조를 사용할 수 있습니다. 예를 들어 이 구조를 사용하여 모든 종류의 장점을 저장할 수 있습니다. 첫 번째 kirk.c는 메시지 큐에 메시지를 추가하고 spock.c는 메시지를 검색합니다.