2013-07-07 2 views
0
  1. msgrcv 시스템 콜에서 msgtype은 무엇입니까? msg 유형의 의미는 무엇입니까? Begineers langauge에서 설명해 주시겠습니까 ?? int msgrcv (int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg);메시지 큐 관련 이슈

  2. 구조체 mybuff { 긴 MTYPE INT 플래그 숯 버프 [50] }

    BUF

    이하 및 (msgsnd는를 전송하는 동안 바와 같이 I 메시지 큐 구조체를 사용하는 경우 정확한 MSGID, & BUF,는 sizeof (BUF)에 documentation에서, 0)

답변

1

:

인자 msgtyp을 다음과 같이 요청 메시지의 타입을 지정

*

msgtyp을 다음 큐의 첫 번째 메시지가 판독되고 0 인 경우. 만일 msgtyp가 0보다 크면 MSG_EXCEPT이 경우 유형의 큐에서 첫번째 메시지하지 에서 msgflg에에 명시되지 않는 한

*

다음 msgtyp 타입 큐의 첫 번째 메시지가 읽어 msgtyp와 동일하면 을 읽습니다.

*

msgtyp을 0 미만, 판독 것이다 만일 msgtyp의 절대 값보다 작거나 같은 낮은 유형 대기열 후 첫 번째 메시지 인 경우. 그 크기에 Blank로 지정된

struct msgbuf { 
    long mtype;  /* message type, must be > 0 */ 
    char mtext[1]; /* message data */ 
}; 

는 여러 줄 필드 배열 (또는 다른 구조) 문서에서도

msgsnd() 번째 파라미터는 이러한 구조에 포인터이어야 , 음수가 아닌 정수 값

세 번째 매개 변수는이 전체 구조의 크기가 아니라 mtype 다음의 모든 크기입니다. 따라서 sizeof(buf)-sizeof(long)입니다.

0

초급 언어로 msgtype 필드를 사용하면 개발자는 큐의 메시지 처리 방식을 유연하게 설계 할 수 있습니다. 모든 유형은 구분하려는 항목을 나타내는 정수입니다. 예를 들면 다음과 같습니다.

(a) a 종류 메시지입니다. 구매 거래 대 환불 거래. 이렇게하면 동일한 대기열에 두 가지 (또는 잠재적으로 더 많은) 종류의 메시지를 허용합니다.

(b) 어떤 프로세스가 메시지를 처리해야하는지에 대한 지시자. msgrcv 함수는 메시지의 특정 유형 만 읽을 때 사용할 수 있습니다. 예를 들어 클라이언트는 하나의 큐에 구매, 판매, 환불, 상태 등의 종류의 메시지를 쓸 수 있습니다. 그러나 여러 프로세스가 관심있는 메시지 만 찾는 큐를 읽을 수 있습니다. BuyPgm은 구매 거래만을 읽습니다.

(c) 충분한주의를 기울이면 클라이언트와 서버가 동일한 큐를 공유 할 수있는 방식으로 msgtype을 사용할 수 있습니다. 일반적으로 대기열은 First In First Out 메커니즘이므로 클라이언트는 일반적으로 하나의 대기열을 읽고 다른 일부 처리를 위해 별도의 대기열을 작성합니다. 그들이 작성한 메시지를 읽지 않으려면 두 개의 대기열이 필요합니다. Msgtypes는이 문제를 해결합니다. 예를 들어, 클라이언트는 msgtypes가 1..100 사이의 다양한 메시지를 작성할 수 있습니다. 일부 프로세스는 이러한 메시지를 처리 ​​한 다음 결과 메시지를 msgtype 200..300으로 쓸 수 있습니다. 원래 클라이언트는 원래 200-300 범위의 메시지 만 읽음으로써 작성한 동일한 큐에서 응답 메시지를 수신 할 수 있습니다. (또는 어떤 msgtype 프로토콜을 만드는지)

(d) msgtypes를 사용하여 일반 대기열을 원하지만 효과적인 우선 순위 대기열로 전환 할 수 있습니다. 예를 들어 모든 주문 트랜잭션의 대기열이있을 수 있지만 중요한 고객이 msgtype을 기반으로 먼저 처리되도록 msgtype 프로토콜을 설계합니다.

chisaycock은 대기열을 읽는 규칙을 게시했습니다. 얼핏보기에는 힘이 들지만 실제로는 그것이 가라 앉을 때 의미가 있습니다.