Linux提供了一系列消息队列的函数接口来让我们方便地使用它来实现进程间的通信。它的用法与其他两个System V PIC机制,即信号量和共享内存相似。
1、msgget函数
该函数用来创建和访问一个消息队列。它的原型为:
int msgget(key_t, key, int msgflg)
与其他的IPC机制一样,程序必须提供一个键来命名某个特定的乎则消息队列。msgflg是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。msgflg可以与IPC_CREAT做或 *** 作,表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CREAT标志会被忽略,而只返回一个标识符。
它返回一个以key命名的消息队列的标识符(非零整数),失败时返回-1.
msgsnd函数
该函数用来把消息添加到消息队列中。它的原型为:
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg)
msgid是由msgget函数返回的消息队列标识符。
msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结岁帆棚构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。所以消息结构要定义成这样:
struct my_message{
long int message_type
/* The data you wish to transfer*/
}
msg_sz是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构轿誉体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。
msgflg用于控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情。
如果调用成功,消息数据的一分副本将被放到消息队列中,并返回0,失败时返回-1.
一般使用步骤:1. 用ftok产生一个key。
2. 调用msgget(使用key作为参数)产生一个队列
3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。
这里需要注意msgsnd可能会失败的两个情况:
a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断 *** 作是否被中断打断,如果被打断,则需要继续尝试。
b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题
4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,孙凯产生的错误码对应的提示信息为no space left on device.
注意点:
1.消息的类型 mtype 不需为非0值。如果液凯稿使用0,则msgsnd会失败,并得到”Invalid argument“错误。
2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。
3.最好使闹孝用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)