最近看system V消息队列,在看到msgsnd()这个函数时,发现了一个错误。(注:我看的是UNIX网络编程卷二:进程间通信 第二版)
msgsnd()函数:追加一条新消息到消息队列的系统调用语法:
#include <sys.msg.h>
int msgsnd(int msqid, const void *ptr, size_t length, int flag);
msqid: 由消息队列的标识符
ptr: 消息缓冲区指针。
消息缓冲区结构为:
struct msgbuf {
long mtype;
char mtext[1];
};
这个结构体我们可以自己定义,书中举例:
#define MY_DATA 8
typedef struct my_msfbuf
{
long mtype;
int16_t mshort ;
char mchar[MY_DATA];
}Message;
msgbuf结构体我们可以自己定义,但必须要有一个消息类型type,我们也可以定义成下面这样:
struct mymesg
{
long type;
struct mymessage
{
int len;
char data[SIZE];
};
};
legth: 消息数据的长度
flag: 为0表示阻塞方式,设置IPC_NOWAIT 表示非阻塞方式
msgsnd 调用成功返回0,不成功返回-1。
msgrcv()函数:从消息队列中读出一条新消息
#include <sys.msg.h>
int msgrcv(int msqid, void *ptr, size_t length, long type, int flag);
msqid: 由消息队列的标识符
ptr :消息缓冲区指针。消息缓冲区结构为:
struct msgbuf {
long mtype;
char mtext[1];
}
length: 消息数据的长度
type: 决定从队列中返回哪条消息:
=0 返回消息队列中第一条消息
>0 返回消息队列中等于mtype 类型的第一条消息。
<0 返回mtype<=type 绝对值最小值的第一条消息。
msgflg 为0表示阻塞方式,设置IPC_NOWAIT 表示非阻塞方式
msgrcv 调用成功返回0,不成功返回-1。