linux IPC -msg 消息隊列

1.進程通訊的方式:消息隊列、 共享內存段 、信號量、管道、SOCKET等。
2.linux 下IPCS命令的做用:報告進程間通訊設施狀態-
ipcs -q查看消息隊列,-m查看內存,-s查看信號量 -a查看上述全部信息 
3.消息隊列:msg  
    3.1 消息隊列建立:int msgget(key_t key,IPC_CREAT|IPC_EXCL|(權限));//成功返回消息隊列標識值
   key_t 爲消息隊列關聯值 : IPC_PRIVATE
   IPC_CREAT,若是隊列存在則打開,不存在則建立。
   IPC_EXCL自己沒什麼用,和IPC_CREAT一塊兒使用時,若是隊列存在則返回錯誤-1
   函數調用成功,則返回 消息隊列標識值,錯誤時,返回不一樣值,如,已存在但沒有權限打開,沒有內存,已達到系統最大消息值,不存在但沒有使用IPC_CREAT...
   3.2 寫消息到消息隊列中
   int msgsnd(int msqid,void * ptr,size_t nbytes ,int flags); //成功返回0
        msqid 消息隊列標識,ptr 消息結構指針,nbytes 消息長度,flags :0表示忽略。
        ptr 指針,指向的是一個可定義的消息緩衝區,用來存儲要發送和接收的消息。定義以下:
   struct msgbuf
          {
               long mtype;//消息類型 >0
               char mtext[1];//消息文本
           }
    3.3 從消息隊列中讀消息
           ssize msgrcv(int msqid,void * ptr,size_t nbytes,long type,int flags);//成功返回接收到的消息數據長度。
          nbytes 要接收的數據長度(應該是msgbuf中定義的數組大小+1),若是接收到的數據長度比nbytes大,則按照flags進行處理:
   flags:  IPC_NOWAIT 隊列中沒有要找到的消息時 出錯返回。errno 爲ENOMSG
      o 函數阻塞    
   type :0 則從隊列頭中開始取消息 ,>0 則找到消息隊列中消息類型爲type在第一個取消息,<0 則返回消息類型小於等於type絕對值的最小值的第1條消息 linux

   3.4  操做消息隊列 int msgctl(int msqid,int cmd,struct msqid_ds * buf);
            buf 爲cmd命令參數。
            cmd: IPC_STAT 取消息隊列中msqid_ds 數據
       IPC_SET設置消息隊列的msqid_ds 數據
       IPC_RMID 刪除消息隊列 數組

linux/msg.h 中定義,以下所示: app

struct msqid_ds{ 函數

    struct ipc_perm     msg_perm;   .net

    msgqnum_t   msg_qnum;       指針

    msglen_t    msg_qbytes;     blog

    pid_t       msg_lspid;      隊列

    pid_t       msg_lrpid;          進程

    time_t      msg_stime;      ip

    time_t      msg_rtime;     

    time_t      msg_ctime;     

    ...

   

    ...

}; --http://blog.csdn.net/renrenhappy/article/details/5862254

相關文章
相關標籤/搜索