在APUE 14.7节对消息队列的讲解中Q最后一D说“我们得出的结论是Q在新的应用E式中不应当再用他们?#8221;
 
    虽然在新的应用程式中不应该再使用消息队列Q我也没有怎么使用qSystem V IPC总觉得在UNIX/Linux~程中少了什么,也许学习一下System V IPCҎ的自信心会有相当大的帮助Q从此我也敢讲我知道如何使用IPC了?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 QueueQ服务端Q或和一个已建立的Message Queueq接Q客LQ。keyQ指定用来生成message id的关键字Qmsgflag和open()的flags很相|可用IPC_CREAT, IPC_EXECL, S_IRUSR{?br> 
    在服务端Q可用IPC_PRIVATEQ或0Q来指定key|来生成一个新的Message Queue,或用指定的key?32位的无符hQ,或用ftok()来生成一个key?br>    #include <sys/types.h>
    #include <sys/ipc.h>
    key_t ftok(const char *pathname, int proj_id);
 
    在客LQ能够直接用服务端生成的message idQ通过某些途径传送,如文档,父子q程Q,也能够用msgget通过和服务端使用相同的key值来生成相同的message idQ但不能使用IPC_PRIVATEQ或0Q,msgflag也不能用IPC_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的计方法: msgsz = sizeof(msgbuf) - sizeof(long);
    msgflag有一个标志:IPC_NOWAIT。当消息队列已满Q可能是消息L辑ֈ了限制|也可能是队列中字节L辑ֈ了限制|Q立卛_错返回,假如没有指定Q则d?/p>

    msgrcv()用来接收消息。msgtype用来指定d的消息类型。msgtype == 0, q回W一个消息; msgtype > 0, q回消息cd为msgtype的消息;msgtype < 0Q?q回队列中类型值小于msgtype的绝对值的消息集中最的消息?br>    msgflag有两个|MSG_NOERROR, IPC_NOWAIT。当MSG_NOERROR被指定的时候,若消息太长就被截断,否则q回错误QIPC_NOWAIT用于需要读取的消息不存在时则阻塞?/p>

    msgctl用于控制消息队列。cmd有三U|IPC_STAT,IPC_SET,IPC_RMID?br>    IPC_STAT用于取出消息队列?msqid_dsl构q保存到buf中?br>    IPC_SET用来把buf指向的msqid_dsQ配|成消息队列的msqid_ds。只有四个D够更改: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;
    };