msgsnd msgrcv 예제

Uncategorized by nrhpadmin

신호가 잡히며, 이 경우 시스템 호출이 EINTR;참조 신호(7)로 설정된 에르노로 실패합니다. (msgsnd()는 신호 처리기를 설정할 때 SA_RESTART 플래그설정에 관계없이 신호 처리기에 의해 중단된 후 자동으로 다시 시작되지 않습니다. 이제 대기열에 메시지가 표시되었으므로 ipcs 명령을 사용하여 큐 상태를 확인합니다. 이제 토론을 대기열에서 실제로 메시지를 검색하도록 전환해 보겠습니다. 이렇게하려면 msgrcv() 시스템 호출을 사용합니다: 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); 다음 예제에서는 msqid 인수로 식별된 큐에 메시지를 보냅니다(해당 값이 이전에 설정되었다고 가정). 이 호출은 사용할 수 있는 메시지가 없는 경우 오류를 보고해야 한다고 지정합니다. 메시지 크기는 sizeof 연산자사용을 사용하여 직접 계산됩니다. msgsnd() 함수는 XSI 메시지 큐에서 작동합니다(IEEE Std 1003.1-2001, 섹션 3.224, 메시지 큐의 기본 정의 볼륨 참조). 이 함수가 실시간에 정의된 실시간 프로세스 간 통신 기능과 상호 작동하는지 여부는 지정되지 않습니다. IPC_NOWAIT가 플래그로 전달되고 메시지를 사용할 수 없는 경우 호출은 호출 프로세스로 ENOMSG를 반환합니다. 그렇지 않으면 msgrcv() 매개 변수를 만족하는 메시지가 큐에 도착할 때까지 호출 프로세스가 차단됩니다. 클라이언트가 메시지를 기다리는 동안 큐가 삭제되면 EIDRM이 반환됩니다.

프로세스가 차단 중에 신호가 잡히고 메시지가 도착할 때까지 기다리는 경우 EINTR이 반환됩니다. 오류가 발생하면 두 함수가 오류를 나타내는 errno를 통해 -1을 반환하고, 그렇지 않으면 msgsnd()가 0을 반환하고 msgrcv()는 실제로 mtext 배열에 복사된 바이트 수를 반환합니다. msgrcv()는 msgctl()를 통해 큐가 제거될 때 메시지 큐를 읽을 때 EIDRM(43)을 반환합니다.