IPC (1) 메시지 큐

6566 단어 메시지 큐ipc
System V IPC 는 메시지 큐, 신 호 량 집합, 공유 메모리 등 세 가지 프로 세 스 간 통신 방식 을 포함한다.
하나.IPC 개체
    IPC 대상 은 프로 세 스 간 통신 의 실체 입 니 다. 생 성 되면 메모리 에 계속 존재 합 니 다. 키 키 키 라 고 하 는 key 를 통 해t 의 수
구조 에 따 르 면 전체 국면 에서 유일한 표지 이다.그러나 IPC 대상 에 대한 접근 은 키 값 이 아니 라 식별 자 를 통 해 이 루어 진다.다른 키
값 은 서로 다른 IPC 식별 자 를 만 들 고, 서로 다른 프로 세 스 는 같은 키 로 IPC 대상 을 열 때 발생 하 는 IPC 식별 자 는 같 습 니 다.
키 값 의 생 성에 대해 ftok 함 수 를 사용 할 수 있 습 니 다. 원형 은 다음 과 같 습 니 다.
    key_t ftok(const char* filename,int proj_id)      //include
        filename: 파일 을 지정 합 니 다. 이 파일 은 존재 하고 가 져 올 수 있어 야 합 니 다.
        proj_id: 계획 번호
        성공 반환 keyt 키, 실패 반환 - 1             //자세 한 설명 은 온라인 매 뉴 얼 참조.
같은 파일 과 같은 proj 사용 하기id 생 성 키 값 은 같 습 니 다. 즉, filename + proj 입 니 다.id---->key_t 는 한 쌍 이다.
하나의 함수.
    다음 단계, IPC 키 를 사용 하여 IPC 대상 을 열 고 IPC 식별 자 를 되 돌려 줍 니 다. semet, shmget, msgget 세 개 를 사용 할 수 있 습 니 다.
함수상세 한 설명 은 다음 글 을 보십시오.
    시스템 은 모든 IPC 대상 에 ipc 를 저장 합 니 다.perm 구조 체, 이 구 조 는 IPC 대상 의 권한 과 소유 자 를 설명 하고 확인 합 니 다.
IPC 작업 이 IPC 대상 에 접근 할 수 있 는 지 여 부 를 정 했 습 니 다.
 struct ipc_perm{ 
        key_t key;    // IPC      
        uid_t uid;    // IPC    ID 
        gid_t gid;    // IPC   ID 
        uid_t cuid;   // IPC           ID 
        gid_t cgid;   // IPC          ID 
        mode_t mode;  // IPC        
        ulong_t seq;  //IPC       
    }; 
    XXXget 함수 로 IPC 대상 을 만 들 때 ipc 초기 화perm 구조 체, 데이터 구성원 을 할당 합 니 다.그 중 모드
매개 변 수 는 XXXget 함수 의 flag 매개 변수 설정 모드 에 따라 존재 하 는 IPC 대상 에 접근 하면 flag 를 0 으로 설정 하면 됩 니 다.
둘.메시지 큐 (include < sys / msg. h >)
    메시지 대기 열 은 커 널 주소 공간 에서 하나의 링크 로 묘사 되 고 모든 메시지 대기 열 에는 유일한 메시지 대기 열 표지 번호 가 있 습 니 다.
시스템 은 모든 메시지 큐 에 msgque 링크 를 유지 합 니 다. 링크 의 모든 노드 는 msqid 를 가리 키 고 있 습 니 다.ds 구조의 지침,
이 구 조 는 메시지 대기 열 을 완전 하 게 묘사 했다.
            time_t msg_stime;     };
    메시지 큐 의 관련 함수:
    int msgget(key_t key,int flag);
        기능: 메시지 큐 식별 자 를 만 들 거나 가 져 옵 니 다.
 struct msqid_ds{ 
        struct ipc_perm msg_perm; 
        struct msg* msg_first; 
        struct msg* msg_last; 
        time_t msg_stime; 
        time_t msg_rtime; 
        time_t msg_ctime; 
        ushort msg_cbytes; 
        ushort msg_qnum; 
        ushort msg_qbytes; 
        ushort msg_lspid; 
        ushort msg_lrpid; 
    }; 
        key: IPC 로 지정 되면PRIVATE 즉 0 시 시스템 설정 키 로 새 메시지 큐 를 만 듭 니 다.
             key 가 0 보다 크 면 매개 변수 flag 를 보고 조작 을 확인 합 니 다.
        flag:IPC_CREAT: 이 대기 열 이 커 널 에 존재 하지 않 으 면 만 듭 니 다.
              IPC_EXCL: IPCCREAT 와 함께 사용 할 때 이 대기 열 이 존재 하면 생 성 에 실 패 했 습 니 다.
        반환: IPC 대상 식별 자 를 성공 적 으로 되 돌려 주 었 습 니 다. 실패 반환 - 1
        하면, 만약, 만약...CREAT 는 단독으로 사용 합 니 다. semget () 은 새로 만 든 메시지 대기 열 에 표지 번 호 를 되 돌려 주거 나 같은 것 을 되 돌려 줍 니 다.
        키 값 이 존재 하 는 대기 열의 표지 번호 입 니 다.하면, 만약, 만약...EXCL 과 IPCCREAT 와 함께 사용 하거나 새 대기 열 을 만 들 거나,
        존재 하 는 대기 열 을 되 돌려 주 거나 - 1.IPC_EXCL 단독 은 소 용이 없습니다. IPCCREAT 를 결합 해서 사용 할 때,
        새로 생 성 된 대기 열의 열기 와 접근 을 보장 합 니 다.
        또한 flag 는 모드 표지 파라미터 로 사용 할 때 액세스 권한 과 비트 또는 (|) 연산 이 필요 합 니 다.
    인 스 턴 스 코드 는 다음 과 같 습 니 다.
        int id=msgget(IPC_PRIVATE,IPC_CREAT|0600);
    int msgctl(int msgqid,int cmd,struct msqid_ds* buff)  
        기능: 메시지 큐 대상 에 대한 제어 에 사용 합 니 다.
        msqid: 조작 할 메시지 큐 식별 자
        cmd: 실행 할 작업 은 다음 을 포함 합 니 다.
            IPC_STAT: msqid 메시지 큐 헤드 데 이 터 를 buff 에 가 져 옵 니 다.
            IPC_SET: 메시지 큐 의 속성 을 설정 합 니 다. 설정 할 속성 은 buff 에 저 장 됩 니 다. 설정 가능 한 속성 은 다음 과 같 습 니 다.
            msg_perm.uid,msg_perm.gid,msg_perm. mode 및 msgqbytes
        반환: 0 성공 반환, 실패 반환 - 1
    인 스 턴 스 코드:
        msqid_id buff;
        msgctl(id,IPC_STAT,&buff);
    int msgsnd(int msqid,const void* msgp,size_t msgsz,int msgflg)
        기능: msgp 메 시 지 를 식별 자 msqid 메시지 큐 에 기록 합 니 다.
        msqid: 조작 할 메시지 큐 식별 자
        msgp: 대기 열 에 보 내 는 메 시 지 는 모든 종류의 구조 일 수 있 지만 첫 번 째 필드 는 log 형식 으로 표시 해 야 합 니 다.
              메 시 지 를 보 내 는 형식 입 니 다. msgrcv 는 이에 따라 메 시 지 를 받 습 니 다.msgp 참조 형식 은 다음 과 같 습 니 다.
              struct msg{
                  long type;     //0 이상, 메시지 유형
                  msg text; / 본문
              }msgp;
              여 기 는 임의의 형식의 구조 데이터 일 수 있 습 니 다.
        msgsz: 메시지 본문 크기, 메시지 형식 을 포함 하지 않 는 4 바이트, 즉 sizeof (msg) - sizeof (long)
        msgflg: 실행 에 대한 자세 한 동작 을 설정 합 니 다. 값 은 다음 과 같 습 니 다.
            IPC NOWAIT: 메시지 대기 열 이 가득 찼 을 때 함수 가 기다 리 지 않 고 바로 돌아 갑 니 다.
            IPC NOERROR: size 바이트 보다 메 시 지 를 보 내 면 메 시 지 를 차단 합 니 다.
        반환: 0 성공 반환, 실패 반환 - 1
    ssize_t msgrcv(int msqid,void* msgp,size_t msgsz,long msgtyp,int msgflg)
        기능: 식별 자가 msqid 인 메시지 대기 열 에서 메 시 지 를 읽 고 msgp 에 병존 합 니 다. 읽 은 메 시 지 는 대기 열 에서 삭 제 됩 니 다.
        msqid: 조작 할 메시지 큐 식별 자
        msgp: 메 시 지 를 저장 하 는 구조 체, 구조 체 유형 은 msgsnd 가 보 내 는 유형 과 같 아야 합 니 다.
        msgsz: 메시지 의 크기 를 받 아들 일 것 입 니 다. 메시지 형식 이 차지 하 는 4 바이트 가 포함 되 지 않 습 니 다.
        msgtyp: = 0: 첫 번 째 메 시 지 를 받 습 니 다.
               >0: msgtyp 과 같은 첫 번 째 메 시 지 를 받 습 니 다.
               <0: msgtyp 의 절대 값 보다 작 거나 같은 첫 번 째 메 시 지 를 받 습 니 다.
        msgflg: 0: 차단 할 때 메 시 지 를 받 고 유형 에 맞 는 메시지 가 없 으 면 계속 차단 하고 기 다 립 니 다.
               IPC NOWAIT: 바람 직 한 메시지 가 없 을 때 함수 가 ENOMSG 오류 메 시 지 를 되 돌려 줍 니 다.
               IPC EXCEPT: msgtyp 과 함께 사용 하여 대기 열의 첫 번 째 유형 부위 msgtyp 의 메 시 지 를 되 돌려 줍 니 다.
               IPC NOERROR: 메시지 차단
    인 스 턴 스 코드 는 다음 과 같 습 니 다.
 typedef struct msg{    
       long type; 
      char text[10]; 
    }MSG; 

    int sendmsg(const char* filename,int proj_id) 
    { 
        key_t key=ftok(filename,proj_id); 
        int id=msgget(key,IPC_CREAT|0600); 
        MSG buf; 
        buf.type=1; 
        strcpy(buf.text,"hello"); 
        int sendlength=sizeof(MSG)-sizeof(long); 
        msgsnd(id,&buf,sendlength,0); 
    } 


    int recvmsg(const char* filename,int proj_id) 
    { 
        key_t key=ftok(filename,proj_id); 
        int id=msgget(key,IPC_CREAT|0600); 
        MSG buf; 
        int recvlength=sizeof(MSG)-sizeof(long);     
        msgrcv(id,&buf,recvlength,1,0); 
        printf("%s
",buf.text); }

좋은 웹페이지 즐겨찾기