msgsnd msgrcv 예제

msgsnd msgrcv 예제

msgsnd() 및 msgrcv() 시스템 호출은 각각 메시지 큐에 메시지를 보내고 메시지를 수신하는 데 사용됩니다. 호출 프로세스는 메시지를 보내고 메시지를 받을 수 있는 권한을 읽기 위해 메시지 큐에 쓰기 권한이 있어야 합니다. msgflg 인수의 MSG_NOERROR 비트는 몇 가지 추가 기능을 제공합니다. 실제 메시지 데이터의 크기가 msgsz보다 크고 MSG_NOERROR가 어설션된 경우 메시지가 잘리고 msgsz 바이트만 반환됩니다. 일반적으로 msgrcv() 시스템 호출은 -1(E2BIG)을 반환하며 메시지는 나중에 검색할 수 있는 큐에 남아 있습니다. 이 동작은 큐 내에서 `엿보기`를 허용하는 다른 래퍼 함수를 만드는 데 사용할 수 있으며, 메시지가 도착하여 요청을 만족하는지 확인할 수 있습니다. 수행됩니다(142줄). 실패하면 메시지 및 오류 번호가 표시됩니다(줄 143-145). 성공하면 메시지가 이렇게 표시되고 반환된 바이트 수와 반환된 msg 형식(반환된 값이 요청된 값과 다를 수 있음)이 수신된 메시지(줄 150-156)가 표시됩니다.

오류가 발생하면 두 함수가 오류를 나타내는 errno를 통해 -1을 반환하고, 그렇지 않으면 msgsnd()가 0을 반환하고 msgrcv()는 실제로 mtext 배열에 복사된 바이트 수를 반환합니다. IPC_NOWAIT가 플래그로 전달되고 메시지를 사용할 수 없는 경우 호출은 호출 프로세스로 ENOMSG를 반환합니다. 그렇지 않으면 msgrcv() 매개 변수를 만족하는 메시지가 큐에 도착할 때까지 호출 프로세스가 차단됩니다. 클라이언트가 메시지를 기다리는 동안 큐가 삭제되면 EIDRM이 반환됩니다. 프로세스가 차단 중에 신호가 잡히고 메시지가 도착할 때까지 기다리는 경우 EINTR이 반환됩니다. 다음 예제에서는 msqid 인수로 식별된 큐에 메시지를 보냅니다(해당 값이 이전에 설정되었다고 가정). 이 호출은 사용할 수 있는 메시지가 없는 경우 오류를 보고해야 한다고 지정합니다. 메시지 크기는 sizeof 연산자사용을 사용하여 직접 계산됩니다. 68 /*메시지 보내기.*/ 69 rtrn = msgsnd (msqid, (const void*) msgp, msgsz, msgflg); 70 if (rtrn == -1) 71 printf (“nMsgsnd 실패.

오류 = %dn”, 72 errno); 73 { 74 /*성공하기 위해 75가 0이어야 하는 테스트 값을 인쇄합니다.*/ 76 printf(“nValue 반환 = %dn”, rtrn); 큐에서 충분한 공간을 사용할 수 있는 경우 msgsnd()가 즉시 성공합니다. 큐 용량은 메시지 큐에 대한 연결된 데이터 구조의 msg_qbytes 필드에 의해 정의됩니다. 큐를 만드는 동안 이 필드는 MSGMNB 바이트로 초기화되지만 msgctl(2)을 사용하여 이 제한을 수정할 수 있습니다. 큐에서 사용할 수 있는 공간이 부족한 경우 msgsnd()의 기본 동작은 공간을 사용할 수 있게 될 때까지 차단하는 것입니다. IPC_NOWAIT가 msgflg에 지정되면 대신 오류 EAGAIN로 호출에 실패합니다. 응용 프로그램은 인수 msgp가 메시지의 형식을 지정하는 긴 형식의 필드를 포함하는 사용자 정의 버퍼를 가리키고 메시지의 데이터 바이트를 포함하는 데이터 부분을 가리킨다는 것을 확인합니다. 아래 구조는 이 사용자 정의 버퍼의 모양을 예로 들 수 있습니다. 원하는 작업에 해당하는 코드를 입력해야 합니다. 선택 변수(줄 23-30)에 저장됩니다. 코드에 따라 프로그램은 다음 msgsnd 또는 msgrcv 섹션에서와 같이 진행됩니다. 필수 구성 조건 : 프로세스 간 통신 메시지 큐는 커널 내에 저장되고 메시지 큐 식별자로 식별된 메시지의 연결된 목록입니다. 새 큐가 만들어지거나 msgget()에 의해 열린 기존 큐가 만들어집니다.

새 메시지는 msgsnd()에 의해 큐의 끝에 추가됩니다. 모든 메시지에는 양수 긴 정수 형식 필드, 음수가 아닌 길이 및 실제 데이터 바이트(길이에 해당)가 있으며, 모두 메시지가 큐에 추가될 때 msgsnd()에 지정됩니다.