링크 ux 메시지 큐 작업

7536 단어 linux
메시지 대기 열 에 대한 작업 은 다음 과 같은 세 가지 유형 이 있 습 니 다. 1. 메시지 대기 열 메시지 대기 열 을 열거 나 만 드 는 커 널 의 지속 성 은 모든 메시지 대기 열 이 시스템 범위 내 에서 해당 하 는 유일한 키 값 을 요구 하기 때문에 메시지 대기 열 에 대한 설명 서 를 얻 으 려 면 이 메시지 대기 열의 키 만 제공 하면 됩 니 다.주: 메시지 대기 열 묘사 서술 자 는 시스템 범위 내 에서 유일한 키 값 으로 생 성 되 며, 키 값 은 해당 시스템 내의 경로 로 볼 수 있 습 니 다.2. 읽 기 및 쓰기 작업 메시지 읽 기 및 쓰기 작업 은 매우 쉽 습 니 다. 개발 자 에 게 모든 메 시 지 는 다음 과 같은 데이터 구조 와 비슷 합 니 다.struct msgbuf{ long mtype; char mtext[1]; };mtype 구성원 은 메시지 형식 을 대표 합 니 다. 메시지 대기 열 에서 메 시 지 를 읽 는 중요 한 근 거 는 메시지 의 유형 입 니 다.mtext 는 메시지 내용 입 니 다. 물론 길이 가 꼭 1 은 아 닙 니 다.따라서 메 시 지 를 보 내 는 데 있어 서 먼저 msgbuf 버퍼 를 미리 설정 하고 메시지 형식 과 내용 을 기록 하 며 해당 하 는 전송 함 수 를 호출 하면 됩 니 다.메 시 지 를 읽 는 데 있어 서 먼저 이러한 msgbuf 버퍼 를 할당 한 다음 에 메 시 지 를 이 버퍼 에 읽 으 면 됩 니 다.3. 메시지 큐 속성 을 획득 하거나 설정 합 니 다. 메시지 큐 의 정 보 는 기본적으로 메시지 큐 에 저장 되 어 있 기 때문에 메시지 큐 헤드 와 비슷 한 구조 (struct msqid ds, 참조 부록 2 를 할당 하여 메시지 큐 의 속성 을 되 돌려 줍 니 다.이 데이터 구 조 를 설정 할 수 있 습 니 다.
메시지 큐 API 1, 파일 이름 부터 키 까지#include <sys/types.h> #include <sys/ipc.h> key_t ftok (char*pathname, char proj); 경로 pathname 에 해당 하 는 키 값 을 되 돌려 줍 니 다.이 함 수 는 메시지 대기 열 에 직접 동작 하지 않 지만, ipc (MSGGET,...) 또는 msgget () 를 호출 하여 메시지 대기 열 묘사 서술 자 를 얻 기 전에 이 함 수 를 호출 합 니 다.전형 적 인 호출 코드 는: key=ftok(path_ptr, 'a'); ipc_id=ipc(MSGGET, (int)key, flags,0,NULL,0); … 2. 시스템 V 메시지 큐 API 시스템 V 메시지 큐 API 는 공동으로 네 개 를 가지 고 있 으 며 사용 할 때 몇 개의 헤더 파일 을 포함해 야 합 니 다.#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 1) int msgget (key t key, int msgflg) 매개 변수 key 는 키 값 으로 ftok 에서 얻 을 수 있 습 니 다.msgflg 인 자 는 일부 표지 위치 입 니 다.이 호출 은 건 치 키 와 상응하는 메시지 대기 열 묘사 서술 자 를 되 돌려 줍 니 다.다음 두 가지 상황 에서 이 호출 은 새로운 메시지 대기 열 을 만 들 것 입 니 다.
  • 메시지 대기 열 이 건 치 key 와 일치 하지 않 는 다 고 가정 하고 msgflg 에 IPC 가 포함 되 어 있 습 니 다.CREAT 표지 위치;
  • key 매개 변 수 는 IPCPRIVATE;

  • 매개 변수 msgflg 는 다음 과 같 습 니 다: IPCCREAT、IPC_EXCL、IPC_NOWAIT 또는 삼자 의 결과.호출 반환: 메시지 대기 열 에 서술 자 를 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 로 돌아 갑 니 다.주: 매개 변수 key 상수 IPC 로 설정PRIVATE 는 다른 프로 세 스 가 이 메시지 큐 에 접근 할 수 없다 는 것 을 의미 하지 않 으 며, 곧 새로운 메시지 큐 를 만 들 것 임 을 의미 합 니 다.2)int msgrcv(int msqid, struct msgbuf *msgp, int msgsz, long msgtyp, int msgflg);이 시스템 은 msgid 가 대표 하 는 메시지 대기 열 에서 메 시 지 를 읽 고 msgp 가 가리 키 는 msgbuf 구조 에 메 시 지 를 저장 합 니 다.msqid 는 메시지 대기 열 에 서술 자 를 묘사 합 니 다.메시지 가 돌아 온 후 msgp 가 가리 키 는 주소 에 저 장 됩 니 다. msgsz 는 msgbuf 의 mtext 구성원 의 길이 (즉 메시지 내용 의 길이) 를 지정 합 니 다. msgtyp 은 읽 기 를 요청 하 는 메시지 형식 입 니 다.메시지 읽 기 표지 msgflg 는 아래 의 몇 개의 상수 값 이나:
  • IPC_NOWAIT 는 조건 을 충족 시 키 지 못 한 메 시 지 를 가정 하고 호출 즉시 되 돌려 줍 니 다. 이때 errno = ENOMSG
  • IPC_EXCEPT 는 msgtyp > 0 과 함께 사용 되 며, 대기 열 에 있 는 첫 번 째 유형 이 msgtyp 이 아 닌 메 시 지 를 되 돌려 줍 니 다
  • IPC_NOERROR 는 대기 열 에서 조건 을 만족 시 키 는 메시지 내용 이 요청 한 msgsz 바이트 보다 크다 고 가정 하면 이 메 시 지 를 차단 하고 차단 부분 을 잃 어 버 립 니 다.

  • msgrcv 매 뉴 얼 에서 메시지 형식 이 다른 값 을 가 져 올 때 (> 0; 0; = 0) 를 구체 적 으로 보 여 주 었 습 니 다. 메시지 대기 열 에 있 는 메 시 지 를 되 돌려 줍 니 다.msgrcv () 차단 해제 조건 은 세 가지 가 있 습 니 다.
  • 메시지 대기 열 에 조건 을 만족 시 키 는 소식 이 있 습 니 다.
  • msqid 대표 메시지 큐 가 삭제 되 었 습 니 다.
  • msgrcv () 를 호출 하 는 프로 세 스 가 신호 에 의 해 중단 되 었 습 니 다.

  • 호출 반환: 메 시 지 를 읽 은 실제 바이트 수 를 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 로 되 돌려 줍 니 다.3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);msgid 가 대표 하 는 메시지 큐 에 메 시 지 를 보 냅 니 다. 곧 보 낼 메 시 지 는 msgp 가 가리 키 는 msgbuf 구조 에 저 장 됩 니 다. 메시지 의 크기 는 msgze 에서 지정 합 니 다.메 시 지 를 보 내 는 데 의미 있 는 msgflg 표 지 는 IPC 입 니 다.NOWAIT, 메시지 대기 열 에 보 낼 메 시 지 를 수용 할 공간 이 충분 하지 않 을 때 msgsnd 가 기다 릴 지 여부 입 니 다.msgsnd () 대기 조건 은 두 가지 가 있 습 니 다.
  • 현재 메시지 의 크기 와 현재 메시지 큐 의 바이트 수 는 메시지 큐 의 총 용량 을 초과 합 니 다.
  • 현재 메시지 큐 의 메시지 수 (단위 "개") 는 메시지 큐 의 총 용량 (단위 "바이트 수") 보다 작 지 않 습 니 다. 이 때 메시지 큐 의 메시지 수 는 매우 많 지만 기본적으로 하나의 바이트 만 있 습 니 다.

  • msgsnd () 차단 해제 조건 은 세 가지 가 있 습 니 다.
  • 상기 두 가지 조건 을 만족 시 키 지 못 한다. 즉, 메시지 대기 열 에 이 메 시 지 를 수용 할 공간 이 있다.
  • msqid 대표 메시지 큐 가 삭제 되 었 습 니 다.
  • msgsnd () 를 호출 하 는 프로 세 스 가 신호 에 의 해 중단 되 었 습 니 다.

  • 호출 반환: 0 을 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);이 시스템 은 msqid 로 표 시 된 메시지 큐 에서 cmd 작업 을 실행 하고 세 가지 cmd 작업 이 있 습 니 다: IPCSTAT、IPC_SET 、IPC_RMID。
  • IPC_STAT: 이 명령 은 메시지 큐 정 보 를 가 져 오 는 데 사 용 됩 니 다. 되 돌아 오 는 정 보 는 buf 가 가리 키 는 msqid 구조 에 저 장 됩 니 다.
  • IPC_SET: 이 명령 은 메시지 큐 의 속성 을 설정 하 는 데 사 용 됩 니 다. 설정 할 속성 은 buf 가 가리 키 는 msqid 구조 에 저 장 됩 니 다.속성 포함 설정 가능: msgperm.uid、msg_perm.gid、msg_perm. mode 및 msgqbytes, 같은 때 msg 에 도 영향 을 줍 니 다.ctime 멤버.
  • IPC_RMID: msqid 표지 의 메시지 큐 를 삭제 합 니 다.

  • 호출 반환: 0 을 성공 적 으로 되 돌려 줍 니 다. 그렇지 않 으 면 - 1 을 되 돌려 줍 니 다.
    ----------------------------------------------------------------------------------------------------------------------
    /*msgserver.c*/
    #include #include #include #include #include #include #include
    #define   MSG_FILE "msgserver.c" #define   BUFFER 255 #define   PERM S_IRUSR|S_IWUSR / * 서버 에서 만 든 메시지 큐 가 마지막 에 삭제 되 지 않 았 습 니 다. ipcrm 명령 으로 삭제 할 * / * ipcrm - q < msqid > * /
    struct msgtype {     long mtype;     char buffer[BUFFER+1]; };
    int main() {     struct msgtype msg;     key_t key;     int msgid;         if((key=ftok(MSG_FILE,'a'))==-1)     {         fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));         exit(1);     }
        if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)     {        fprintf(stderr, "Creat Message Error:%s/n", strerror(errno));         exit(1);    }     printf("msqid = %d/n", msgid);    while(1)    {         msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);         fprintf(stderr,"Server Receive:%s/n", msg.buffer);         msg.mtype = 2;         msgsnd(msgid, &msg, sizeof(struct msgtype), 0);     }     exit(0); }
    /* msgclient.c */
    #include #include #include #include #include #include #include #include
    #define   MSG_FILE "msgserver.c" #define   BUFFER 255 #define   PERM S_IRUSR|S_IWUSR
    struct msgtype {     long mtype;     char buffer[BUFFER+1]; };
    int main(int argc, char **argv) {     struct msgtype msg;     key_t key;     int msgid;         if(argc != 2)     {         fprintf(stderr,"Usage:%s string/n", argv[0]);         exit(1);     }         if((key=ftok(MSG_FILE,'a'))==-1)     {         fprintf(stderr,"Creat Key Error:%s/n", strerror(errno));         exit(1);     }         if((msgid=msgget(key, PERM))==-1)     {         fprintf(stderr,"Creat Message  Error:%s/n", strerror(errno));         exit(1);     }         msg.mtype = 1;     strncpy(msg.buffer, argv[1], BUFFER);     msgsnd(msgid, &msg, sizeof(struct msgtype), 0);      memset(&msg, '/0', sizeof(struct msgtype));     msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);     fprintf(stderr, "Client receive:%s/n", msg.buffer);     exit(0);}    

    좋은 웹페이지 즐겨찾기