客户端-服务端
版本一
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);
}
参考链接
- 【进程间通信(IPC)之消息队列详解及测试用例】https://blog.csdn.net/f110300641/article/details/112188594
内核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;
}
参考链接
- 【Linux系统编程—消息队列】https://www.jianshu.com/p/7e3045cf1ab8