标签:
#include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf); int msgget(key_t key, int msgflg); int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg); int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);与信号量和共享内存一样,头文件sys/types.h和sys/ipc.h通常被msg.h自动包含进程序.
int msgget(key_t key, int msgflg);
/*************************************************************************
> File Name: msg1.c
> Description: msg1.c程序用于接收消息
> Author: Liubingbing
> Created Time: 2015年07月19日 星期日 15时28分22秒
> Other: msg1.c
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/msg.h>
/* 消息结构的定义,接收函数用长整型变量my_msg_type来确定消息的类型,some_text是要传递的数据 */
struct my_msg_st {
long int my_msg_type;
char some_text[BUFSIZ];
};
int main()
{
int running = 1;
int msgid;
struct my_msg_st some_data;
long int msg_to_receive = 0;
/* msgget函数用于创建和访问一个消息队列
* 第一个参数是key用来命名某个特定的消息队列,不相关的进程通过它来访问同一个消息队列
* 第二个参数是权限标志
* 如果成功,则返回一个正整数,即队列标识符.如果失败,则返回-1 */
msgid = msgget((key_t)123, 0666 | IPC_CREAT);
/* 判断消息队列是否创建成功 */
if (msgid == -1) {
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
while (running) {
/* msgrcv函数从一个消息队列中获取消息
* 第一个参数是msgget函数返回的消息队列标识符
* 第二个参数是一个指向准备接收消息的指针
* 第三个参数是指向的消息的长度
* 第四个参数是一个长整数,它可以实现一种简单形式的接收优先级,设置为0时,就获取队列中的第一个消息(按照消息发送的顺序接收它们)
* 第五个参数用于控制当队列中没有相应类型的消息可以接收时将发生的事情
* 如果成功,则返回放到接收缓冲区中的字节数.如果失败,则返回-1*/
if (msgrcv(msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0) == -1) {
fprintf(stderr, "msgrcv failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
/* 打印获取的消息的文本 */
printf("You wrote: %s", some_data.some_text);
/* 如果遇到end,则退出循环 */
if (strncmp(some_data.some_text, "end", 3) == 0) {
running = 0;
}
}
/* msgctl函数用于控制消息
* 第一个参数是msgget函数返回的消息队列标识符
* 第二个参数command是将要采取的动作,IPC_RMID表示要删除消息队列
* 第三个参数是一个指向msqid_ds结构的指针
* 如果成功,则返回0.如果失败,则返回-1 */
if (msgctl(msgid, IPC_RMID, 0) == -1) {
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}msg2.c/*************************************************************************
> File Name: msg2.c
> Description: msg2.c用于发送消息
> Author: Liubingbing
> Created Time: 2015年07月19日 星期日 16时07分47秒
> Other: msg2.c
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct my_msg_st {
long int my_msg_type;
char some_text[MAX_TEXT];
};
int main()
{
int running = 1;
struct my_msg_st some_data;
int msgid;
char buffer[BUFSIZ];
/* msgget函数创建或访问消息队列
* 第一个参数key命名某个特定的消息队列,不相关的进程通过它来取得相同的消息队列
* 第二个参数是权限标志
* 如果成功,则返回一个正整数,即队列标识符.如果失败,则返回-1 */
msgid = msgget((key_t)123, 0666 | IPC_CREAT);
if (msgid == -1) {
fprintf(stderr, "msgget failed with error: %d\n", errno);
exit(EXIT_FAILURE);
}
while (running) {
printf("Enter some text: ");
/* 从标准输入stdin中读入BUFSIZ个字节的数据到buffer指向的内存 */
fgets(buffer, BUFSIZ, stdin);
/* 将标志my_msg_type设置为1,则获取具有相同类型(1)的第一个消息 */
some_data.my_msg_type = 1;
/* 从buffer复制数据到some_data.some_text中 */
strcpy(some_data.some_text, buffer);
/* msgsnd函数把消息添加到消息队列中
* 第一个参数是msgget函数返回的消息队列标识符
* 第二个参数是一个指向准备发送消息的指针
* 第三个参数是消息的长度
* 第四个参数是msgflg控制在当前消息队列满或队列消息到达系统返回的限制时将要发生的事情
* 如果成功,则返回0.如果失败,则返回-1 */
if (msgsnd(msgid, (void *)&some_data, MAX_TEXT, 0) == -1) {
fprintf(stderr, "msgsnd failed\n");
exit(EXIT_FAILURE);
}
if (strncmp(buffer, "end", 3) == 0) {
running = 0;
}
}
exit(EXIT_SUCCESS);
}允许两个程序都可以创建消息队列,但只有接收者在接收完最后一个消息之后可以删除它.版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/yiranant/article/details/46959541