最近发现消息队列的一些隐蔽的点,通过代码注释记录分享下。样例来自https://www.cnblogs.com/52php/p/5862114.html,感谢。
接收端代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
struct
msg_st
{
long
int
msg_type;
char
text[BUFSIZ];
};
int
main(
int
argc,
char
**argv)
{
int
msgid = -1;
struct
msg_st data;
long
int
msgtype = 0;
// 注意1
// 建立消息队列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if
(msgid == -1)
{
fprintf
(stderr,
"msgget failed width error: %d\n"
,
errno
);
exit
(EXIT_FAILURE);
}
// 从队列中获取消息,直到遇到end消息为止
while
(1)
{
/*
1、msgrcv的第三个参数是BUFSIZ,并不是sizeof(
*/
if
(msgrcv(msgid, (
void
*)&data, BUFSIZ, msgtype, 0) == -1)
{
fprintf
(stderr,
"msgrcv failed width erro: %d"
,
errno
);
}
printf
(
"You wrote: %s\n"
, data.text);
// 遇到end结束
if
(
strncmp
(data.text,
"end"
, 3) == 0)
{
break
;
}
}
// 删除消息队列
if
(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf
(stderr,
"msgctl(IPC_RMID) failed\n"
);
}
exit
(EXIT_SUCCESS);
}
|
发送端代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <errno.h>
#define MAX_TEXT 512
struct
msg_st
{
long
int
msg_type;
char
text[MAX_TEXT];
};
int
main(
int
argc,
char
**argv)
{
struct
msg_st data;
char
buffer[BUFSIZ];
int
msgid = -1;
// 建立消息队列
msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
if
(msgid == -1)
{
fprintf
(stderr,
"msgget failed error: %d\n"
,
errno
);
exit
(EXIT_FAILURE);
}
// 向消息队里中写消息,直到写入end
while
(1)
{
printf
(
"Enter some text: \n"
);
fgets
(buffer, BUFSIZ, stdin);
data.msg_type = 1;
// 注意2
strcpy
(data.text, buffer);
// 向队列里发送数据
if
(msgsnd(msgid, (
void
*)&data, MAX_TEXT, 0) == -1)
{
fprintf
(stderr,
"msgsnd failed\n"
);
exit
(EXIT_FAILURE);
}
// 输入end结束输入
if
(
strncmp
(buffer,
"end"
, 3) == 0)
{
break
;
}
sleep(1);
}
exit
(EXIT_SUCCESS);
}