从函数名就可以看出,msgsnd()函数是用来向消息队列发送消息的。在linux/msg.h 它 的函数定义是这样的: 系统调用: msgsnd() 函数声明: int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg ) 返回值: 0 on success -1 on error: errno = EAGAIN (queue is full, and IPC_NOWAIT was asserted) EACCES (permission denied, no write permission) EFAULT (msgp address isn't accessable – invalid) EIDRM (The message queue has been removed) EINTR (Received a signal while waiting to write) EINVAL (Invalid message queue identifier, nonpositive message type, or invalid message size) ENOMEM (Not enough memory to copy message buffer) 传给msgsnd()函数的第一个参数msqid 是消息队列对象的标识符(由msgget()函数得 到),第二个参数msgp 指向要发送的消息所在的内存,第三个参数msgsz 是要发送信息的 长度(字节数),可以用以下的公式计算: msgsz = sizeof(struct mymsgbuf) - sizeof(long); 第四个参数是控制函数行为的标志,可以取以下的值: 0,忽略标志位; IPC_NOWAIT,如果消息队列已满,消息将不被写入队列,控制权返回调用函数的线 程。如果不指定这个参数,线程将被阻塞直到消息被可以被写入。 这里我们将创建一个封装函数来演示msgsnd()函数的使用: int send_message( int qid, struct mymsgbuf *qbuf ) { int result, length; /* The length is essentially the size of the structure minus sizeof(mtype) */ length = sizeof(struct mymsgbuf) - sizeof(long); if((result = msgsnd( qid, qbuf, length, 0)) == -1) { return(-1); } return(result); }