鍦ˋPUE 14.7鑺傚娑堟伅闃熷垪鐨勮瑙d腑錛屾渶鍚庝竴孌佃“鎴戜滑寰楀嚭鐨勭粨璁烘槸錛氬湪鏂扮殑搴旂敤紼嬪紡涓笉搴斿綋鍐嶄嬌鐢ㄤ粬浠?#8221;
 
    铏界劧鍦ㄦ柊鐨勫簲鐢ㄧ▼寮忎腑涓嶅簲璇ュ啀浣跨敤娑堟伅闃熷垪錛屾垜涔熸病鏈夋庝箞浣跨敤榪嘢ystem V IPC鎬昏寰楀湪UNIX/Linux緙栫▼涓皯浜?jiǎn)浠涔堬紝涔熻瀛︿範(fàn)涓涓婼ystem V IPC瀵規(guī)垜鐨勮嚜淇″績(jī)浼?xì)鏈夌浉褰撳ぇ鐨勫府鍔╁Q屼粠姝ゆ垜涔熸暍璁叉垜鐭ラ亾濡備綍浣跨敤IPC浜?jiǎn)銆?br>

鍏堟妸鍚勪釜鍑芥暟鍘熷艦鍒楀嚭銆?br>    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
 
    int msgget(key_t key, int msgflag);
    int msgsnd(int msgid, struct msgbuf *msgp, size_t msgsz, int msgflag);
    ssize_t msgrcv(int msgid, struct msgbuf *msgp, size_t msgsz, long msgtype, int msgflag);
    int msgctl(int msgid, int cmd, struct msqid_ds *buf);
 
    msgget()鐢ㄦ潵鍒涘緩Message Queue錛堟湇鍔$錛夋垨鍜屼竴涓凡寤虹珛鐨凪essage Queue榪炴帴錛堝鎴風(fēng)錛夈俴ey錛屾寚瀹氱敤鏉ョ敓鎴恗essage id鐨勫叧閿瓧錛宮sgflag鍜宱pen()鐨刦lags寰堢浉浼鹼紝鍙敤IPC_CREAT, IPC_EXECL, S_IRUSR絳夈?br> 
    鍦ㄦ湇鍔$錛屽彲鐢↖PC_PRIVATE錛堟垨0錛夋潵鎸囧畾key鍊鹼紝鏉ョ敓鎴愪竴涓柊鐨凪essage Queue,鎴栦嬌鐢ㄦ寚瀹氱殑key鍊?32浣嶇殑鏃犵鍙鋒暟錛夛紝鎴栦嬌鐢╢tok()鏉ョ敓鎴愪竴涓猭ey銆?br>    #include <sys/types.h>
    #include <sys/ipc.h>
    key_t ftok(const char *pathname, int proj_id);
 
    鍦ㄥ鎴風(fēng)錛岃兘澶熺洿鎺ヤ嬌鐢ㄦ湇鍔$鐢熸垚鐨刴essage id錛堥氳繃鏌愪簺閫斿緞浼犻侊紝濡傛枃妗o紝鐖跺瓙榪涚▼錛夛紝涔熻兘澶熺敤msgget閫氳繃鍜屾湇鍔$浣跨敤鐩稿悓鐨刱ey鍊兼潵鐢熸垚鐩稿悓鐨刴essage id錛屼絾涓嶈兘浣跨敤IPC_PRIVATE錛堟垨0錛夛紝msgflag涔熶笉鑳戒嬌鐢↖PC_CREAT銆?/sys>

    Return Value: Sucess return value is the message id(non-negative integer), otherwise -1 return.
 
    msgsnd()鐢ㄦ潵鍙戦佹秷鎭?br>    struct msgbuf {
            long mtype;
            char mtext[1];
    };
    msgsz鐨勮綆楁柟娉曪細(xì) msgsz = sizeof(msgbuf) - sizeof(long);
    msgflag鏈変竴涓爣蹇楋細(xì)IPC_NOWAIT銆傚綋娑堟伅闃熷垪宸叉弧錛堝彲鑳芥槸娑堟伅鎬繪暟杈懼埌浜?jiǎn)闄愬埗鍊鹼紝涔熷彲鑳芥槸闃熷垪涓瓧鑺傛繪暟杈懼埌浜?jiǎn)闄愬埗鍊鹼級(jí)錛岀珛鍗沖嚭閿欒繑鍥烇紝鍋囧娌℃湁鎸囧畾錛屽垯闃誨銆?/p>

    msgrcv()鐢ㄦ潵鎺ユ敹娑堟伅銆俶sgtype鐢ㄦ潵鎸囧畾璇誨彇鐨勬秷鎭被鍨嬨俶sgtype == 0, 榪斿洖絎竴涓秷鎭紱 msgtype > 0, 榪斿洖娑堟伅綾誨瀷涓簃sgtype鐨勬秷鎭紱msgtype < 0錛?榪斿洖闃熷垪涓被鍨嬪煎皬浜巑sgtype鐨勭粷瀵瑰肩殑娑堟伅闆嗕腑鏈灝忕殑娑堟伅銆?br>    msgflag鏈変袱涓鹼細(xì)MSG_NOERROR, IPC_NOWAIT銆傚綋MSG_NOERROR琚寚瀹氱殑鏃跺欙紝鑻ユ秷鎭お闀垮氨琚埅鏂紝鍚﹀垯榪斿洖閿欒錛汭PC_NOWAIT鐢ㄤ簬闇瑕佽鍙栫殑娑堟伅涓嶅瓨鍦ㄦ椂鍒欓樆濉炪?/p>

    msgctl鐢ㄤ簬鎺у埗娑堟伅闃熷垪銆俢md鏈変笁縐嶅鹼細(xì)IPC_STAT,IPC_SET,IPC_RMID銆?br>    IPC_STAT鐢ㄤ簬鍙栧嚭娑堟伅闃熷垪鐨?msqid_ds緇撴瀯騫朵繚瀛樺埌buf涓?br>    IPC_SET鐢ㄦ潵鎶奲uf鎸囧悜鐨刴sqid_ds錛岄厤緗垚娑堟伅闃熷垪鐨刴sqid_ds銆傚彧鏈夊洓涓艱兘澶熸洿鏀癸細(xì)msg_perm.uid, msg_perm.gid,msg_perm.mode, msg_qbytes銆?br>    IPC_RMID鐢ㄦ潵鍒犻櫎娑堟伅闃熷垪銆?br> 
    struct msqid_ds
    {
        struct ipc_perm msg_perm;
        ulong msg_qbytes; //max of bytes of queue
        ...
    };
    struct ipc_perm
    {
        uid_t uid; //owner's effective user id
        gid_t gid; //owner's effective group id
        uid_t cuid; //creator's effective user id
        gid_t cgid; //creator's effective group id
        mode_t mode; //access modes
        ulong seq; //slot usage sequence number
        key_t key;
    };