MultiThread-message-Commmunication
所属分类:网络
开发工具:Unix_Linux
文件大小:282KB
下载次数:8
上传日期:2013-10-08 14:03:39
上 传 者:
leping19110111
说明: 多进程间的通信,消息队列的形式,里面有很多个消息队列的例子。我收集的,用来开发。我的QQ 359559774
(More inter-process communication, message queues form, there are many examples of a message queue. I have collected, to develop. My QQ 359559774)
文件列表:
多进程消息队列 (0, 2013-04-28)
多进程消息队列\80099476timer (0, 2013-04-28)
多进程消息队列\80099476timer\timer.c (2186, 2011-07-20)
多进程消息队列\Linux Posix 消息队列的代码示例 (0, 2013-04-28)
多进程消息队列\Linux Posix 消息队列的代码示例\mgqueue.c (4921, 2007-11-07)
多进程消息队列\linux 下进程间的通信,用消息队列 (0, 2013-04-28)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue (0, 2009-10-21)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg (6200, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg.c (925, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg.c~ (919, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg_msqid_ds.c (747, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg_receiver_example.c (830, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\msg_sender_example.c (912, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\recv (5707, 2009-08-27)
多进程消息队列\linux 下进程间的通信,用消息队列\msg_queue\send (5603, 2009-08-27)
多进程消息队列\linux下消息队列的C语言封装 (0, 2013-04-28)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue (0, 2013-04-28)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn (0, 2010-11-18)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\entries (1345, 2010-11-15)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\format (2, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\prop-base (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\props (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\error.c.svn-base (2043, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\error.h.svn-base (1175, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\Makefile.svn-base (405, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\MessageQueue.c.svn-base (965, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\MessageQueue.h.svn-base (1695, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\recv.c.svn-base (781, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\text-base\send.c.svn-base (733, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\tmp (0, 2010-11-15)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\tmp\prop-base (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\tmp\props (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\.svn\tmp\text-base (0, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\error.c (2043, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\error.h (1175, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\Makefile (405, 2010-11-04)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\MessageQueue.c (992, 2013-04-28)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\MessageQueue.c.bak (989, 2013-04-28)
多进程消息队列\linux下消息队列的C语言封装\MessageQueue\MessageQueue.h (1695, 2010-11-04)
... ...
1. Linux为SYS V IPC(消息队列,信号灯,共享内存)提供统一的用户界面
int ipc(uint call, int first, int second, int third, void *ptr, long fifth);
call: IPC对象操作方式 如:MSGGET、MSGSND、MSGRCV和MSGCTL
int ipc(MSGGET, int first, int second, int third, void *ptr, long fifth);
--> msgget(first, second);
--> msgget(key, msgflag);
int ipc(MSGSND, int first, int second, int third, void *ptr, long fifth);
--> int msgsnd(first, *ptr, second, third);
--> int msgsnd(msqid, *msgp, msgsz, msgflag);
int ipc(MSGRCV, int first, int second, int third, void *ptr, long fifth);
--> int msgrcv(first, *ptr, second, fifth, third);
--> int msgrcv(msqid, *msgp, msgsz, msgtyp, msgflg);
int ipc(MSGCTL, int first, int second, int third, void *ptr, long fifth);
--> int msgctl(first, second, *ptr);
--> int msgctl(msqid, cmd, *buf);
1. 统一的API界面,参数特性不直观,为开发带来不便。
2. 统一的API调用,Linux所特有,类UNIX平台移植问题。
3. 统一的API调用,是对SYS V IPC API的封装,无效率优势。
4. Linux继承并兼容SYS V, 且SYS V IPC API数量不多,参数直观。
// 结论:
Linux统一的ipc()可作为扩展,SYS V IPC更值得推荐。
2. SYS IPC 共有特征
(1) 类似I/O操作和file操作,先得到标识符。
fd = open();
fp = fopen();
id = msgget() // 非负整数
(2) 类似I/O操作和file操作,对标识符进行操作,控制IPC结构。
read(fd, ...)/write(fd, ...)/close(fd, ...)
fread(fp, ...)/fwrite(fp, ...)/fclose(fp, ...)
id = msgsnd(id, ...)/msgrcv(id, ...)/msgctl(id, ...)
(3) 标志符来源。
创建IPC结构时,指定key值,而后由内核负责key值与id的绑定,
使得通信双方在统一IPC结构上“会合”。
a. key_t key 定义为 long key:对应内核空间消息队列地址
b. 会合:通信双方都能访问到IPC结构
本质:
通信双方访问到同一存储区域
会合3种方式:
--------------------------------------------------------------------------------------------------------------------------------------------------------------
a. 通过文件(外存)传递标识符id,而内核负责key与id的绑定,那么通信双方必能访问到同一IPC结构体(内存)
“共享文件路径”
b. 通过公用头文件保存通信双方都认可的key值,访问到统一IPC结构体。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
c. 通过同一个路径名和课题ID,调用ftok()将路径名和课题ID转为key,从而创建一个消息队列。
key_t ftok(const char *pathname, char proj_id);
路径名和课题ID由用户进程指定,如:
char *pathname = "/linux/msgqueue";
proj_id = 'z'; // ASCII character
key = ftok(pathname, 'z');
ftok(): 将指定文件的索引节点号取出,前面加上proj_id得到key。
消息队列: 链表结构
(队列ID)
队列 [消息]->[消息]->[消息]->[消息] ---- ->[消息]
消息结构体:
struct mymesg{
long mtype; // 消息类型 msg.mtype 具有一定格式的数据流,可作优先级
char mtext[nbytes]; // 消息数据缓冲 msg.mtext nbytes: 消息长度
}msg;
struct mymesg *ptr = NULL;
ptr = &msg; // 指向结构体第一个成员长整形数,即:指向了结构体。
队列结构体:
struct msqid_ds{ // msgget()时初始化
// 进程定义
struct ipc_perm msg_perm; // permission IPC对队列的访问权限
/*
初始化
*/
// 内核分配,该消息队列在内核中存放的位置
struct msg *msg_first; // Head 队首指针 struct msg *msg_last; // Tail 队尾指针
// 进程定义
......
/*
初始化
*/
}
limit:
MSGMAX 单个消息最大字节
MSGMNB 单个队列最大字节
MSGMNI 并存于系统中的消息队列最大数量
MSGTOL 并存于系统中的最大消息数
msgget
// Creat_New
// Get_Exist
Succ: 返回非负队列描述符(msgid)
int msgget(key_t key, int flag);
参数:
key
1. 新建消息队列
(1) key参数为IPC_PRIVATE
(2) 当前无消息队列与key对应,且flag中包含IPC_CREAT标志位
2. 获得已存在消息队列
key 由ftok()获得
flag:
IPC_CREATE:
IPC_CREAT | IPC_EXCL: 消息队列已存在,则返回失败。
struct msqid_ds { msgget()
struct ipc_perm msg_perm; 初始化 flag (0666)-> mode
struct msg *msg_first;
struct msg *msg_last;
ulong msg_cbytes;
ulong msg_qnum; 0
ulong msg_qbytes; 系统限定值
pid_t msg_lspid; 0
pid_t msg_lrpid; 0
time_t msg_stime; 0
time_t msg_rtime; 0
time_t msg_ctime; 系统当前时间
}
msgsnd
// Add_Message_Tail
int msgsnd(int msqid, const void *ptr, size_t nbytes, int flag);
struct mymesg {
long mtype;
char mtext[nbytes];
}msg;
struct mymesg *ptr = NULL;
ptr = &msg;
nbytes: sizeof(mtext)
1. 消息队列ID既定
2. 消息结构体组成既定
3. 消息结构体地址既定
4. 消息长度nbytes既定
// 消息不定长
msgrcv
// Get_Message_Head // 1.从队首取消息,遵循FIFO。
// Get_Message_msg.mtype // 2.按消息类型字段取消息,非先进先出。
int msgrcv(int msqid, void *ptr, size_t nbytes, long type, int flag);
nbytes: flag
实际能接收的长度 该队列既定的消息长度 MSG_NOERROR no
> 正常读取
< 截断读取 不通知 err: E2BIG
// FIFO
type == 0 队列第一个消息
// 非FIFO
type > 0 队列中消息类型为type的第一个消息
type < 0 队列中消息类型<=(type绝对值),且在这种消息中,其类型值又最小的消息。
msgctl:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
队列ID:
msqid
执行操作:
cmd
队列属性:
struct msqid_ds *buf
msgctl
struct msqid_ds { cmd:IPC_STAT IPC_SET (cuid,uid,root) IPC_RMID
struct ipc_perm msg_perm; uid,gid,mode
struct msg *msg_first;
struct msg *msg_last;
ulong msg_cbytes;
ulong msg_qnum;
ulong msg_qbytes; msqid_ds->*buf qbytes (仅root)
pid_t msg_lspid;
pid_t msg_lrpid;
time_t msg_stime;
time_t msg_rtime;
time_t msg_ctime;
}
近期下载者:
相关文件:
收藏者: