IPC-System V-MQ-代码示例

客户端-服务端

版本一

Code
int commom_msg(int msgFlag)
{
	// 生成IPC关键字
	key_t k = ftok(PATHNAME, PROJ_ID);
	// 获取消息队列ID
	int msgId = msgget(k, msgFlag);
	if (msgId < 0)
	{
		perror("msgget error");
		return -2;
	}
	return msgId;
}
int get_msg(void)
{
	return commom_msg(IPC_CREAT);
}
int create_msg_queue(void)
{
	return commom_msg(IPC_CREAT | IPC_EXCL | 0666); // | 0666
}
int delete_msg(int msgID)
{
	int ret = msgctl(msgID, IPC_RMID, 0);
	if (ret < 0)
	{
		perror("msgctl error");
		return -1;
	}
	return 0;
}
int send_msg(int msgId, long type, const char *sendInfo)
{
	struct msgbuf msg;
	msg.msg_type = type;
	strcpy(msg.msg_text, sendInfo);
	int send = msgsnd(msgId, &msg, sizeof(msg.msg_text), 0);
	if (send < 0)
	{
		perror("send error");
		return -1;
	}
	return 0;
}
int recv_msg(int msgId, long type, char buf[])
{
	struct msgbuf msg;
	int rcv = msgrcv(msgId, &msg, sizeof(msg.msg_text), type, 0);
	if (rcv < 0)
	{
		perror("msgrcv error");
		return -1;
	}
	strcpy(buf, msg.msg_text);
	return 0;
}
void mq_func_client(void)
{
	int msgId = get_msg();
	char buf[MAX];
	while (1)
	{
		printf("Client input:");
		fflush(stdout);
		ssize_t s = read(0, buf, sizeof(buf) - 1);
		if (s > 0)
		{
			buf[MAX - 1] = '\0';
			send_msg(msgId, CLIENT_TYPE, buf);
		}
		recv_msg(msgId, SEVER_TYPE, buf);
		if (strcmp("exit", buf) == 0)
		{
			printf("All exit\n");
			break;
		}
	}
	//delete_msg(msgId);
}
void mq_func_server(void)
{
	char buf_msg[MAX];
	int msgID = create_msg_queue();
	while (1)
	{
		recv_msg(msgID, CLIENT_TYPE, buf_msg);
		printf("Client say:%s\n", buf_msg);
		printf("Server input:");
		fflush(stdout);
		ssize_t s = read(0, buf_msg, sizeof(buf_msg) - 1);
		if (s > 0)
		{
			buf_msg[MAX - 1] = '\0';
			send_msg(msgID, SEVER_TYPE, buf_msg);
			if (strcmp(buf_msg, "exit") == 0)
				break;
		}
	}
	delete_msg(msgID);
}

参考链接

内核MQ读取

版本一

Code
int message_send_main_function(void)
{
	int i, res;
	int msgId = msgget(0x8888, IPC_CREAT | 0x664);
	Msg msgBuf[10] = {
		{1, {"Luffy", 17}},
        {1, {"Zoro", 19}},
        {2, {"Nami", 18}},
        {2, {"Usopo", 17}},
        {1, {"Sanji", 19}},
        {3, {"Chopper", 15}},
        {4, {"Robin", 28}},
        {4, {"Franky", 34}},
        {5, {"Brook", 88}},
        {6, {"Sunny", 2}}
	};
	for (i = 0; i < 10; i++)
	{
		res = msgsnd(msgId, &msgBuf, sizeof(Person), 0);
	}
	return 0;
}
void print_msg(Msg *msg)
{
	printf("{ type = %ld, name = %s, age = %d }\n",
		msg->mtype, msg->person.name, msg->person.age);
	return;
}
int message_recv_main_function(void)
{
#if 0
	if (argc < 2) {
		printf("usage: %s \n", argv[0]);
		return -1;
	}
	long type = atol(argv[1]);
#endif
	//long type = atol("1");
	long type = 1;
	int msgId = msgget(0x8888, 0);
	Msg msgBuf;
	int res;
	while (1)
	{
		res = msgrcv(msgId, &msgBuf, sizeof(Person), type, IPC_NOWAIT);
		if (res < 0)
		{
			if (errno == ENOMSG)
			{
				printf("No message\n");
				break;
			}
			printf("No message 1\n");
			break;
		}
		print_msg(&msgBuf);
	}
	return 0;
}

参考链接

其他参考链接

posted @ 2024-01-24 13:55  starc的miao  阅读(20)  评论(0)    收藏  举报