system v消息队列msgsnd函数

/*msgsnd函数将一个消息添加到消息队列*/
//第一个参数为消息队列的标示符msgid
//第二个参数为指针,只想准备发送的消息
//第三个为指针,指向消息长度
//第四个为控制着当前消息队列满或到达系统上限时将要发生的事情
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#define ERR_EXIT(m)
		do \
		{           \
			perror(m); \
			exit(EXIT_FAILURE); \
		}while(0) 
//第四个参数msgflg = IPC_NOWAIT表示队列满不等待,返回EAGAIN错误
//消息结构体,一方面大小需小于系统限制MSGMAX,另外需以long/int长整形开始
/*消息结构体*/
struct msgbuf{
	long mtype;//占四个字节
	char mtext[1];
}
/* ./msg_send 8192 2 */
//从前向后读参数存入argv[1],argv[2].....
int main(int argc, char* argv[])
{
	if(argc != 3)
	{
		fprintf(stderr, "Usage: %s <bytes> <type>\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	int len = atoi(argv[1]);//8192消息长度
	int type = atoi(argv[2]);//读2为消息类型
	int msgid;

	msgid = msgget(1234, 0666 | IPC_CREAT | IPC_EXCL);
	msgid = msgget(1234, 0);//0可以打开任何权限的消息队列,只打开不创建

	if(msgid == -1)
	{
		ERR_EXIT("msgget");
	}

	printf("msgget success\n");
	
	struct msgbuf *ptr;//消息结构体
	ptr = (struct msgbuf*)malloc(sizeof(long)+len);
	ptr->mtype = type;//mtext未设置,即发送任意消息
	if(msgsnd(msgid, ptr, len, 0)<0)//当消息大于限制时,阻塞发送
	{
		ERR_EXIT("msgsnd");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_22753933/article/details/84960895