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; }

近期下载者

相关文件


收藏者