Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4273
  • 博文数量: 3
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 32
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-22 12:59
文章分类

全部博文(3)

文章存档

2013年(3)

我的朋友

分类: 其他平台

2013-12-06 01:18:57

一、IPC
XSI IPC即: 消息队列,信号量,共享存储器。
XSI IPC 源于系统V的IPC功能,有自己的名字空间,所以用的所自己的系统调用。
1.标示符和键
标示符是IPC对象的内部名,为了要多个进程合作需要一个共知的外部名,于是使用了键。
键数据类型:key_t  长整型
键可以自己指定也可以用ftok函数创建。
函数原型: key_t  ftok(const char *path, int id);

2。权限结构
XSI IPC为每个IPC都设置了了一个 ipc_perm结构,用来规定权限和所有者
点击(此处)折叠或打开
  1. struct ipc_perm {
  2.                key_t __key; /* Key supplied to msgget(2) */
  3.                uid_t uid; /* Effective UID of owner */
  4.                gid_t gid; /* Effective GID of owner */
  5.                uid_t cuid; /* Effective UID of creator */
  6.                gid_t cgid; /* Effective GID of creator */
  7.                unsigned short mode; /* Permissions */
  8.                unsigned short __seq; /* Sequence number */
  9.            };
3. IPC是系统范围内的,没有访问计数,可以用ipcs -l显示相关限制。
    IPC么有用文件系统的名字空间,所以不能用文件系统的相关调用来访问,也不能使用文件描述符,所以也不能进行多路转接:
   这使得难于一次使用多个IPC结构,以及在文件系统或设备I/O中使用IPC结构。
   优点:可靠,流是受控的,面向记录,可以使用不是FIFO的方式处理数据

二 消息队列
点击(此处)折叠或打开
  1. struct msqid_ds {
  2.                struct ipc_perm msg_perm; /* Ownership and permissions */
  3.                time_t msg_stime; /* Time of last msgsnd(2) */
  4.                time_t msg_rtime; /* Time of last msgrcv(2) */
  5.                time_t msg_ctime; /* Time of last change */
  6.                unsigned long __msg_cbytes; /* Current number of bytes in
  7.                                                 queue (nonstandard) */
  8.                msgqnum_t msg_qnum; /* Current number of messages
  9.                                                 in queue */
  10.                msglen_t msg_qbytes; /* Maximum number of bytes
  11.                                                 allowed in queue */
  12.                pid_t msg_lspid; /* PID of last msgsnd(2) */
  13.                pid_t msg_lrpid; /* PID of last msgrcv(2) */
  14.            }
msg_ipc.h

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <sys/ipc.h>
  7. #include <sys/msg.h>
  8. #include <sys/stat.h>

  9. #define MSG_FILE "msg_ipc.h"
  10. #define MSG_ID    199
  11. #define MSG_LEN        512

  12. struct my_msg
  13. {
  14.     int    msg_type;
  15.     char msg_text[MSG_LEN];
  16. };


  17. #define err_msg(MSG)    {    \
  18.     perror(MSG);    \
  19.     exit(errno);    \
  20. }

  21. #define DEBUG
  22. #ifdef DEBUG
  23. #define DPRINT(CHAR,INT)    printf(CHAR" %d \n", INT)
  24. #endif
server

点击(此处)折叠或打开

  1. #include "msg_ipc.h"
  2. #define MSG_TYPE    2
  3. #define MODE_PERM    S_IRUSR|S_IWUSR
  4. int main()
  5. {
  6.     key_t msg_key;
  7.     struct my_msg    msg;
  8.     int msg_id;
  9.     char msg_text[MSG_LEN] = "buffer need snd test";

  10.     if((msg_key=ftok(MSG_FILE, MSG_ID)) == -1)
  11.         err_msg("ftok error:");
  12.     DPRINT("msg_key = ", msg_key);
  13.     
  14.     if((msg_id=msgget(msg_key, MODE_PERM|IPC_CREAT|IPC_EXCL)) == -1)
  15.         err_msg("msgget failed");

  16.     memset(&msg, '\0', sizeof(struct my_msg));
  17.     msg.msg_type = MSG_TYPE;
  18.     memcpy(msg.msg_text, msg_text, sizeof(msg_text));
  19.     
  20.     if(msgsnd(msg_id, &msg, sizeof(msg.msg_text), 0) == -1)
  21.     {
  22.         printf(" msg snd_error: %s", strerror(errno));
  23.         if(msgctl(msg_id, IPC_RMID, NULL) == -1)
  24.             err_msg("rm msg queue failer");
  25.     }    
  26.         
  27.     printf("snd msg success\n");
  28.     return 0;
  29. }
cline:

点击(此处)折叠或打开

  1. #include "msg_ipc.h"
  2. #define MODE_PERM    S_IRUSR|S_IWUSR
  3. int main()
  4. {
  5.     key_t msg_key;
  6.     int    msg_id;
  7.     struct my_msg    msg;
  8.     int count;

  9.     if((msg_key=ftok(MSG_FILE, MSG_ID)) == -1)
  10.         err_msg("ftok err lient");
  11.     if((msg_id=msgget(msg_key, MODE_PERM)) == -1)
  12.         err_msg("msgget err clinet");
  13.     if((count=msgrcv(msg_id, &msg, MSG_LEN, 0, IPC_NOWAIT)) == -1)
  14.         err_msg("msgrcv error");
  15.     printf("receve %d msg: %s\n", count, msg.msg_text);

  16.     return 0;
  17. }



阅读(357) | 评论(0) | 转发(0) |
0

上一篇:Pipe学习

下一篇:没有了

给主人留下些什么吧!~~