메시지 큐 예제

(6) 서버가 일시 중지되어 메시지 큐에 메시지가 추가될 때까지 기다립니다. 메시지가 검색되면 표준 출력에 기록됩니다. 기록된 대로 서버 프로그램은 클라이언트가 길이 0의 메시지를 보낼 때 메시지 큐를 제거합니다. 모든 클라이언트 프로세스가 완료된 후에만 메시지 큐를 제거되도록 서버 프로그램을 수정합니다. 한 가지 방법은 서버가 메시지 큐를 사용하여 클라이언트 프로세스를 추적하고 마지막 프로세스가 길이 0의 메시지를 보낼 때만 종료하는 것입니다. “뭐야?! 하나의 바이트 배열만 메시지 큐에 넣을 수 있습니까?! 가격대비 괜찮은 호텔” 정답이 아닙니다. 첫 번째 요소가 긴 경우 큐에 메시지를 넣을 모든 구조를 사용할 수 있습니다. 예를 들어 이 구조를 사용하여 모든 종류의 장점을 저장할 수 있습니다. 세 개의 명령줄 인수를 찾을 수 없는 경우 오류 메시지가 생성되고 서버 프로그램이 종료됩니다. 그렇지 않으면 argv[1]의 내용은 메시지 큐 식별자로 사용되는 정수 값으로 변환됩니다.

그런 다음 서버가 루프에 들어갑니다. 먼저 큐에서 서버(1) 형식의 메시지를 수신하려고 시도합니다. msgrcv에서 반환되는 바이트 수가 0이면 서버는 클라이언트 프로세스가 완료된 것으로 가정합니다. 이 경우 루프가 종료되고 서버가 msgctl 시스템 호출(35번)을 통해 메시지 큐를 제거하고 종료합니다. 그러나 메시지 큐에서 메시지가 성공적으로 검색되면 함수 process_msg에서 메시지가 처리되고 클라이언트 프로세스가 검색할 수 있도록 큐에 다시 배치됩니다. 인수는 조금 이상하지만, 약간의 눈썹 박동으로 이해할 수있다. 첫 번째 키는 연결(또는 생성)할 큐를 설명하는 시스템 차원의 고유 식별자입니다. 이 큐에 연결하려는 다른 모든 프로세스는 동일한 키를 사용해야 합니다. 좋아, 그럼 어떻게 이 정보를 메시지 큐에 전달합니까? 대답은 간단합니다, 내 친구 : 그냥 msgsnd() 사용 : 명령 줄에 클라이언트 프로그램의 이름을 입력하면 프로그램이 실행됩니다.

클라이언트는 메시지 큐를 만들고 로컬에 있어야 하는 서버 프로세스를 호출합니다. 입력을 요청하는 프롬프트가 화면에 표시됩니다. 사용자가 문자열을 입력하고 프레스가 반환될 때마다 클라이언트는 처리를 위해 메시지 큐에 입력을 배치합니다. 메시지가 처리된 후 클라이언트는 메시지 큐에서 메시지를 검색하여 화면에 표시합니다.

¡Contactanos!