新着情報TOP > msgrcv 예제

msgrcv 예제

응용 프로그램은 인수 msgp가 메시지의 형식을 지정하는 긴 형식의 필드를 포함하는 사용자 정의 버퍼를 가리키고 메시지의 데이터 바이트를 포함하는 데이터 부분을 가리킨다는 것을 확인합니다. 아래 구조는 이 사용자 정의 버퍼의 모양을 예로 들 수 있습니다. 큐는 msqid 인수로 식별됩니다(값이 이전에 설정되었다고 가정). 이 호출은 사용할 수 있는 메시지가 없는 경우 오류를 보고해야 하지만 메시지가 너무 큰 경우에는 보고하지 않도록 지정합니다. 메시지 크기는 sizeof 연산자사용을 사용하여 직접 계산됩니다. `msgop 시스템 호출 예`는 메뉴 기반 프로그램입니다. 그것은 msgsnd 및 msgrcv 시스템 호출을 사용하는 모든 가능한 조합을 행사 할 수 있습니다. 143 if (rtrn == -1) { 144 printf(“nMsgrcv 실패., 오류 = %dn”, errno); 145 } 146 else {147 printf (“nMsgctl이 성공했다”); 148 printf (“msqid = %dn”, 149 msqid); msg_lrpid는 호출 프로세스의 프로세스 ID와 동일하게 설정되어야 한다. msgrcv에 대한 크기 인수는 수신할 메시지 텍스트의 최대 바이트 수여야 합니다. 크기에는 mtype 필드의 크기가 포함되어서는 안 됩니다.

수신할 메시지 텍스트의 크기가 크기 인수보다 큰 경우 결과는 플래그 인수에 의해 지정된 옵션에 따라 달라집니다. 마지막으로 수신할 바이트 수가 요청됩니다. 그것은 msgsz (라인 132-135)에 저장됩니다. 가변 및 구조성 이름은 시놉시스에 있는 이름과 최대한 가깝게 선택되었습니다. 그들의 선언은 자명하다. 이러한 이름은 프로그램을 더 읽기 쉽게 만들고 프로그램에 로컬이기 때문에 완벽하게 유효합니다. msgsnd 시스템 호출이 수행됩니다(라인 69). 실패하면 오류 번호(줄 70-72)와 함께 오류 메시지가 표시됩니다.

성공하면 반환된 값이 인쇄되고 0이어야 합니다(줄 73-76). 인수 msgflg 원하는 형식의 메시지가 큐에 없는 경우 수행 될 작업을 지정 합니다. msgbuf.mtype은 1로 설정해야 합니다. 프로그램에서 가장 먼저 묻는 것은 메시지를 보내거나 받을지 여부입니다. 원하는 작업에 해당하는 코드를 입력해야 합니다. 선택 변수(줄 23-30)에 저장됩니다. 코드에 따라 프로그램은 다음 msgsnd 또는 msgrcv 섹션에서와 같이 진행됩니다. msgsnd()가 실패하면 errno는 메시지 큐의 바이트 별의 기본 최대 크기(Linux에서 /proc/sys/커널/msgmnb를 통해 읽고 수정할 수 있음)의 값 중 하나로 설정됩니다. 수퍼유저는 msgctl(2) 시스템 호출을 통해 MSGMNB를 초과하여 메시지 큐의 크기를 늘릴 수 있습니다.

원하는 유형의 메시지가 큐에 배치됩니다. 이 프로그램은 msgop (S)에 지정된 필수 헤더 파일을 포함하여 시작됩니다 (5-9 줄). 이 프로그램에서 errno는 외부 변수로 선언됩니다. 따라서 sys/errno.h 헤더 파일을 포함할 필요가 없습니다. 프로세스가 메시지를 수신하기 위해 절전 모드로 진행되는 동안 메시지 큐가 제거되었습니다. 38 /*메시지 유형 설정.*/ 39 printf(“n양정수n”); 40 printf(“n”에 대한 메시지 유형(long)); 41 printf(“메시지 = “); 42 스캔프(“%ld”, 및 msgtyp); 43 msgp->mtype = msgtyp; 10 구조msgbuf1 { 11 긴 mtype; 12 char mtext[8192]; 13 } sndbuf, rcvbuf, *msgp; 코드가 메시지를 수신하는 경우 프로그램은 다음 단락과 같이 실행을 계속합니다. . 34 printf(“n”의 msqid를 입력합니다); 35 printf(“n에 대한 메시지 큐”); 36 printf(“메시지 처리 = “); 37 스캔(“%d”, 및 msqid); 인수 msgszmtext의 바이트의 크기를 지정 합니다. 수신된 메시지는 msgsz보다 크고 (msgflg 및 MSG_NOERROR)이 0이 아닌 경우 msgsz 바이트로 잘립니다.