原文链接:
链接
从函数名就可以看出,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);
}
原文链接:链接从函数名就可以看出,msgsnd()函数是用来向消息队列发送消息的。在linux/msg.h 它的函数定义是这样的:系统调用: msgsnd()函数声明: int msgsnd ( int msqid, struct msgbuf *msgp, int msgsz, int msgflg )返回值: 0 on success-1 on error: errno = EA...
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。
1.message
函数
该
函数
用来创建和访问一个消息队列。它的原型为:
int msgget(key_t key, int msgflg);
msgflg是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。msgflg可以与IPC_CREAT做或操作,表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CRE
最近看system V消息队列,在看到
msgsnd
()这个
函数
时,发现了一个错误。(注:我看的是UNIX网络编程卷二:进程间通信 第二版)
msgsnd
()
函数
:追加一条新消息到消息队列的系统调用语法:
#include <sys.msg.h>
int
msgsnd
(int msqid, const void *ptr, size_t lengt...
文章目录消息队列介绍msgget:创建和访问一个消息队列
msgsnd
:发送信息,把一条消息添加到消息队列里去msgrcv:从一个消息队列里检索(接收)消息代码实例
消息队列介绍
消息队列:IPC之一
内核开辟的一个队列,进程可以通过调用系统API方式调用消息队列
函数
,给内核消息队列发送或者接收数据
涉及
函数
:
包含头文件:<sys/msg.h><sys/types.h>和<sys/ipc.h>
int msgctl(int msqid, int cmd, struct m
进程间通信设计
题目要求:消息的创建,发送和接收。
设计思路:使用系统调用msgget(),
msgsnd
(),msgrcv()及msgctl()编制一长度为1K的消息的发送和接收程序。
(站在巨人的肩膀上)
该
函数
返回值为0表示成功发送消息,否则出错,错误码存储在errno中。
msgsnd
函数
是阻塞的,即如果队列已经满了,调用会被阻塞,直到有空间可用为止。如果需要非阻塞,则可以在msgflg参数中指定IPC_NOWAIT。
下面是一个示例代码,用于发送消息:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <errno.h>
struct message
long type;
char data[BUFSIZ];
int main()
key_t key;
int msgid;
struct message msg;
key = ftok(".", 'a'); //生成key值
msgid = msgget(key, 0666 | IPC_CREAT); //创建消息队列
if (msgid == -1)
perror("msgget error");
exit(EXIT_FAILURE);
msg.type = 1;
strcpy(msg.data, "Hello, world!");
if (
msgsnd
(msgid, &msg, sizeof(msg.data), 0) == -1) //发送消息
perror("
msgsnd
error");
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
上述示例程序会创建消息队列,并向队列中发送一条内容为"Hello, world!"的消息。其中,type字段表示消息类型,可以用于消息过滤和区分不同的消息。