【LINUX C】消息队列
2016-10-26 23:33
148 查看
"消息队列"是在消息的传输过程中保存消息的容器。
1、Msgget
作用:创建消息队列
原型:int magget(key_t key,int
msgget);
参数:
Key
键值:IPC_PRIVATE设定一个私有的键值,也可由ftok函数来获得
ftok原型如下:
key_t ftok( char * fname, int id )
fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。
当成功执行的时候,一个key_t值将会被返回,否则
-1 被返回。
Msgflag:权限
返回值:成功就返回消息队列,失败: -1;
头文件:#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
2、Msgsnd
作用:写数据到消息队列
原型:int msgsnd(int msgid,const void* msggp,size_t
msgsize,int msgflg);
参数:msggp:消息结构(消息类型+数据)
Struct msgbuf
{
Long msgtype;
Char mtex[1];
}
Msgsize:正文消息的字节数
Msgflag:IPC_NOWAIT:写不进去消息,直接返回
0:一直等到能写进消息为止
返回值:成功 0;失败
-1.
3、Msgrcv
作用:从消息队列中发送数据
原型:int msgrcv(int msgid, void *msgp, size_t msgsize,long int msgtype,int msgflg);
参数:msgtyp : 0
接受消息队列的第一个消息
>0:接受消息队列第一个msgtyp消息
<0: 接受消息的第一个类型值
4、Msgctl
作用:控制消息队列,可以删除消息队列
原型:int msgctl(int msgid, int cmd, struct msgid_ds *buf);
参数:msgid:消息队列ID号
Cmd:IPC_STAT:
读取消息队列的数据结构msgid_ds,存储在buf指定地址中
IPC_SET:设置消息队列的权限
IPC_RMID:删除消息队列
Buf:消息队列的结构类型变量
返回值:
成功 0 ; 出错 -1
键值相同,进的就是同一个队列
接收信息的程序源文件为msgreceive.c的源代码为:
[cpp] view
plain copy
print?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h>
struct msg_st
{
long int msg_type;
char text[BUFSIZ];
};
int main()
{
int running = 1;
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 with error: %d\n", errno);
exit(EXIT_FAILURE);
}
//从队列中获取消息,直到遇到end消息为止
while(running)
{
if(msgrcv(msgid, (void*)&data, BUFSIZ, msgtype, 0) == -1)
{
fprintf(stderr, "msgrcv failed with errno: %d\n", errno);
exit(EXIT_FAILURE);
}
printf("You wrote: %s\n",data.text);
//遇到end结束
if(strncmp(data.text, "end", 3) == 0)
running = 0;
}
//删除消息队列
if(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
发送信息的程序的源文件msgsend.c的源代码为:
[cpp] view
plain copy
print?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.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 running = 1;
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 with error: %d\n", errno);
exit(EXIT_FAILURE);
}
//向消息队列中写消息,直到写入end
while(running)
{
//输入数据
printf("Enter some text: ");
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)
running = 0;
sleep(1);
}
exit(EXIT_SUCCESS);
}
与命名管道相比,消息队列的优势在于:
1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。
2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。
3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。
1、Msgget
作用:创建消息队列
原型:int magget(key_t key,int
msgget);
参数:
Key
键值:IPC_PRIVATE设定一个私有的键值,也可由ftok函数来获得
ftok原型如下:
key_t ftok( char * fname, int id )
fname就时你指定的文件名(该文件必须是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。
当成功执行的时候,一个key_t值将会被返回,否则
-1 被返回。
Msgflag:权限
返回值:成功就返回消息队列,失败: -1;
头文件:#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
2、Msgsnd
作用:写数据到消息队列
原型:int msgsnd(int msgid,const void* msggp,size_t
msgsize,int msgflg);
参数:msggp:消息结构(消息类型+数据)
Struct msgbuf
{
Long msgtype;
Char mtex[1];
}
Msgsize:正文消息的字节数
Msgflag:IPC_NOWAIT:写不进去消息,直接返回
0:一直等到能写进消息为止
返回值:成功 0;失败
-1.
3、Msgrcv
作用:从消息队列中发送数据
原型:int msgrcv(int msgid, void *msgp, size_t msgsize,long int msgtype,int msgflg);
参数:msgtyp : 0
接受消息队列的第一个消息
>0:接受消息队列第一个msgtyp消息
<0: 接受消息的第一个类型值
4、Msgctl
作用:控制消息队列,可以删除消息队列
原型:int msgctl(int msgid, int cmd, struct msgid_ds *buf);
参数:msgid:消息队列ID号
Cmd:IPC_STAT:
读取消息队列的数据结构msgid_ds,存储在buf指定地址中
IPC_SET:设置消息队列的权限
IPC_RMID:删除消息队列
Buf:消息队列的结构类型变量
返回值:
成功 0 ; 出错 -1
键值相同,进的就是同一个队列
接收信息的程序源文件为msgreceive.c的源代码为:
[cpp] view
plain copy
print?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/msg.h>
struct msg_st
{
long int msg_type;
char text[BUFSIZ];
};
int main()
{
int running = 1;
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 with error: %d\n", errno);
exit(EXIT_FAILURE);
}
//从队列中获取消息,直到遇到end消息为止
while(running)
{
if(msgrcv(msgid, (void*)&data, BUFSIZ, msgtype, 0) == -1)
{
fprintf(stderr, "msgrcv failed with errno: %d\n", errno);
exit(EXIT_FAILURE);
}
printf("You wrote: %s\n",data.text);
//遇到end结束
if(strncmp(data.text, "end", 3) == 0)
running = 0;
}
//删除消息队列
if(msgctl(msgid, IPC_RMID, 0) == -1)
{
fprintf(stderr, "msgctl(IPC_RMID) failed\n");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
发送信息的程序的源文件msgsend.c的源代码为:
[cpp] view
plain copy
print?
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.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 running = 1;
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 with error: %d\n", errno);
exit(EXIT_FAILURE);
}
//向消息队列中写消息,直到写入end
while(running)
{
//输入数据
printf("Enter some text: ");
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)
running = 0;
sleep(1);
}
exit(EXIT_SUCCESS);
}
与命名管道相比,消息队列的优势在于:
1、消息队列也可以独立于发送和接收进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。
2、同时通过发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法。
3、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收。
相关文章推荐
- Linux环境进程间通信——消息队列
- Linux环境进程间通信(三) --消息队列
- linux_c 开发(5-5)进程间通讯_消息队列
- Linux进程间通信——消息队列
- Linux环境进程间通信(三):消息队列
- linux 消息队列
- Linux进程间通信—消息队列
- Linux进程间通信——消息队列
- linux 消息队列
- Linux进程间通信(二)——共享内存、消息队列
- linux ipc—消息队列
- Linux的进程间通信-消息队列
- linux进程间通讯-消息队列
- 详解linux进程间通信-消息队列
- Linux环境进程间通信(三): 消息队列
- Linux学习笔记28——消息队列
- Linux进程间通信—消息队列
- linux 消息队列