Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1045565
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: LINUX

2015-12-02 15:19:35

queue.c文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/msg.h>
  5. #include <sys/ipc.h>

  6. #define IPCKEY 0x12

  7. /*消息数据类型可以自己定义:
  8. 注意:
  9. 1,必须包含:正的整形消息类型+其后紧跟着的消息数据
  10. 2,该结构的成员可以有多个,不是只能有2个
  11. 3,msgsnd函数的第3个长度值:一定是除了long之外,剩下的长度都是我们的消息的长度,以字节为单位换个说法:是long之外,结构体其他成员的总长,不是其他成员实际数据的长度。*/
  12. typedef struct mymesg
  13. {
  14.         long mtype;
  15.         char name[128];
  16.         char value[128];
  17. }MYMESG;

  18. int main(int argc, char * * argv)
  19. {
  20.         int ret;
  21.         struct msqid_ds msg_info;
  22.         /*消息队列标示符属性结构体:每个队列都有一个 struct msqid_ds 与其相关联*/

  23.         char path[1024];
  24.         memset(path, 0, sizeof(path));
  25.         strcpy(path, "/etc/hosts");
  26.         printf("path=[%s]\n", path);

  27.         key_t key = 0;
  28.         printf("key=[%x]\n", key);
  29.         /*path必须是已经存在的文件名,将path文件的索引节点号取出,
  30.         前面加上子序号IPCKEY,得到key_t的返回值。
  31.         功能:可以保证两个不同用户下的两组相同程序获得互不干扰的IPC键值
  32.         */
  33.         key = ftok(path, IPCKEY);
  34.         if(key < 0)
  35.         {
  36.                 printf("ftok err!\n");
  37.                 exit(-1);
  38.         }
  39.         printf("key=[%x]\n", key);

  40.         int msgid;
  41.         /*功能:创建 或者 获取一个消息队列ID,返回值就是消息队列标示符,同一进程内部就靠这个ID来识别。
  42.         IPC_CREAT : 队列不存在,则创建,队列存在,则打开。
  43.         IPC_CREAT|IPC_EXCL : 队列不存在,则创建,队列存在,则报错
  44.         单独使用IPC_EXCL,没什么意义*/
  45.         msgid = msgget(key, IPC_CREAT|0666);
  46.         if(msgid < 0)
  47.         {
  48.                 printf("msgget err!\n");
  49.                 exit(-1);
  50.         }
  51.         MYMESG mymesg1;
  52.         mymesg1.mtype = 1;
  53.         memset(mymesg1.name, 0, sizeof(mymesg1.name));
  54.         strcpy(mymesg1.name, "zhuren");
  55.         memset(mymesg1.value, 0, sizeof(mymesg1.value));
  56.         strcpy(mymesg1.value, "wangxiancai");
  57.         
  58.         /*msgsnd功能:向消息队列发送消息,发送的消息总在队列的尾端。
  59.                         当msgsnd成功返回,内核将与消息队列相关的 struct msqid_ds结构得到更新。
  60.         第3个参数:消息数据的长度:是long之外,结构体其他成员的总长。
  61.         第4个参数:0:若队列已满,则调用msgsnd的进程将会挂起阻塞,直到消息可以写入到队列中。
  62.                             IPC_NOWAIT:若队列已满,那么此消息则不会写到消息队列中,将出错返回。
  63.         */
  64.         ret = msgsnd(msgid, &mymesg1, sizeof(struct mymesg)-sizeof(long), 0);
  65.         if(ret < 0)
  66.         {
  67.                 printf("msgsnd err!\n");
  68.                 exit(-1);
  69.         }
  70.         sleep(2);
  71.         
  72.         /*msgctl函数*/
  73.         ret = msgctl(msgid, IPC_STAT, &msg_info);
  74.         if(ret < 0)
  75.         {
  76.                 printf("msgctl err!\n");
  77.                 exit(-1);
  78.         }
  79.         printf("向消息队列中加入了1条消息之后的属性:\n");
  80.         printf("the message number is:队列中消息的个数:[%d]\n",msg_info.msg_qnum);
  81.         printf("the crow max number is:系统限制队列的最大数:[%d]\n",msg_info.msg_qbytes);
  82.         printf("the last message's pid is:最后向消息队列中发送数据的进程号:[%d]\n",msg_info.msg_lspid);
  83.         printf("the last receve meassage's pid is:最后从消息队列中取得数据的进程号:[%d]\n",msg_info.msg_lrpid);
  84.         printf("the last send time is:最后向消息队列中发送数据的时间:[%s]\n",ctime(&(msg_info.msg_stime)));
  85.         printf("the last receve time is:最后从消息队列中取得数据的时间:[%s]\n",ctime(&(msg_info.msg_rtime)));
  86.         printf("the last changed time is:消息队列最后发生数据变化的时间:[%s]\n",ctime(&(msg_info.msg_ctime)));
  87.         printf("the message UID is 用户ID: [%d]\n",msg_info.msg_perm.uid);
  88.         printf("the message GID is 组ID: [%d]\n",msg_info.msg_perm.gid);
  89.         
  90.         mymesg1.mtype = 2;
  91.         memset(mymesg1.name, 0, sizeof(mymesg1.name));
  92.         strcpy(mymesg1.name, "puren");
  93.         memset(mymesg1.value, 0, sizeof(mymesg1.value));
  94.         strcpy(mymesg1.value, "zhangqiuping");
  95.         ret = msgsnd(msgid, &mymesg1, sizeof(struct mymesg)-sizeof(long), 0);
  96.         if(ret < 0)
  97.         {
  98.                 printf("msgsnd err!\n");
  99.                 exit(-1);
  100.         }
  101.         sleep(3);
  102.         
  103.         /*msgctl函数
  104.         IPC_STAT:取得此队列的struct msqid_ds结构,存放在msg_info中
  105.         IPC_SET:按照msg_info 结构中的值,设置此队列的 struct msqid_ds结构
  106.         IPC_RMID:从系统中删除消息队列,及仍然留在该队列中的所有的数据,这种删除是立即生效的    */
  107.         ret = msgctl(msgid, IPC_STAT, &msg_info);
  108.         if(ret < 0)
  109.         {
  110.                 printf("msgctl err!\n");
  111.                 exit(-1);
  112.         }
  113.         printf("向消息队列中加入了第2条消息之后的属性:\n");
  114.         printf("the message number is:队列中消息的个数:[%d]\n",msg_info.msg_qnum);
  115.         printf("the crow max number is:系统限制队列的最大数:[%d]\n",msg_info.msg_qbytes);
  116.         printf("the last message's pid is:最后向消息队列中发送数据的进程号:[%d]\n",msg_info.msg_lspid);
  117.         printf("the last receve meassage's pid is:最后从消息队列中取得数据的进程号:[%d]\n",msg_info.msg_lrpid);
  118.         printf("the last send time is:最后向消息队列中发送数据的时间:[%s]\n",ctime(&(msg_info.msg_stime)));
  119.         printf("the last receve time is:最后从消息队列中取得数据的时间:[%s]\n",ctime(&(msg_info.msg_rtime)));
  120.         printf("the last changed time is:消息队列最后发生数据变化的时间:[%s]\n",ctime(&(msg_info.msg_ctime)));
  121.         printf("the message UID is 用户ID: [%d]\n",msg_info.msg_perm.uid);
  122.         printf("the message GID is 组ID: [%d]\n",msg_info.msg_perm.gid);
  123.         
  124.         MYMESG mymesg2;
  125.         /*msgrcv功能:从消息队列获取消息。每成功获取一条消息,消息队列中的消息就会少一条。
  126.                                     当msgsnd成功返回,内核将与消息队列相关的 struct msqid_ds结构得到更新。
  127.         第3个参数:消息数据的长度:是long之外,结构体其他成员的总长。
  128.         第4个参数:与自定义消息数据类型的,第一个成员的值相对应。
  129.         第5个参数:0:若队列没有指定的消息,则调用msgrcv的进程将会挂起阻塞,直到队列中有指定的消息,或者队列被删除了,msgrcv出错返回
  130.                             IPC_NOWAIT:若队列没有指定的消息,则调用msgrcv的进程将出错返回。
  131.                             MSG_NOERROR:若设置了这个标志,若实际返回的消息大于第3个参数,则该消息被截短,消息已经不再队列中了。
  132.                                                     若未设置这个标志,实际返回的消息又大于第3个参数,则出错返回,消息任留在队列中。
  133.         */
  134.         ret = msgrcv(msgid, &mymesg2, sizeof(struct mymesg)-sizeof(long), 1, 0);
  135.         printf("ret=[%d]\n", ret);
  136.         if(ret < 0)
  137.         {
  138.                 printf("msgrcv err!\n");
  139.                 exit(-1);
  140.         }
  141.         printf("从消息队列中取得一条数据如下:\n");
  142.         printf("mymesg2.mtype=[%d]\n", mymesg2.mtype);
  143.         printf("mymesg2.name=[%s]\n", mymesg2.name);
  144.         printf("mymesg2.value=[%s]\n", mymesg2.value);
  145.         
  146.                 /*msgctl函数
  147.         IPC_STAT:取得此队列的struct msqid_ds结构,存放在msg_info中
  148.         IPC_SET:按照msg_info 结构中的值,设置此队列的 struct msqid_ds结构
  149.         IPC_RMID:从系统中删除消息队列,及仍然留在该队列中的所有的数据,这种删除是立即生效的    */
  150.         ret = msgctl(msgid, IPC_STAT, &msg_info);
  151.         if(ret < 0)
  152.         {
  153.                 printf("msgctl err!\n");
  154.                 exit(-1);
  155.         }
  156.         printf("从消息队列中取走了1条消息之后的属性:\n");
  157.         printf("the message number is:队列中消息的个数:[%d]\n",msg_info.msg_qnum);
  158.         printf("the crow max number is:系统限制队列的最大数:[%d]\n",msg_info.msg_qbytes);
  159.         printf("the last message's pid is:最后向消息队列中发送数据的进程号:[%d]\n",msg_info.msg_lspid);
  160.         printf("the last receve meassage's pid is:最后从消息队列中取得数据的进程号:[%d]\n",msg_info.msg_lrpid);
  161.         printf("the last send time is:最后向消息队列中发送数据的时间:[%s]\n",ctime(&(msg_info.msg_stime)));
  162.         printf("the last receve time is:最后从消息队列中取得数据的时间:[%s]\n",ctime(&(msg_info.msg_rtime)));
  163.         printf("the last changed time is:消息队列最后发生数据变化的时间:[%s]\n",ctime(&(msg_info.msg_ctime)));
  164.         printf("the message UID is 用户ID: [%d]\n",msg_info.msg_perm.uid);
  165.         printf("the message GID is 组ID: [%d]\n",msg_info.msg_perm.gid);
  166.         
  167.         while(1);
  168.     
  169.         return 0;
  170.         
  171. }
queue2.c文件

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/msg.h>
  5. #include <sys/ipc.h>

  6. #define IPCKEY 0x12

  7. /*消息数据类型可以自己定义:
  8. 注意:
  9. 1,必须包含:正的整形消息类型+其后紧跟着的消息数据
  10. 2,该结构的成员可以有多个,不是只能有2个
  11. 3,msgsnd函数的第3个长度值:一定是除了long之外,剩下的长度都是我们的消息的长度,以字节为单位换个说法:是long之外,结构体其他成员的总长,不是其他成员实际数据的长度。*/
  12. typedef struct mymesg
  13. {
  14.         long mtype;
  15.         char name[128];
  16.         char value[128];
  17. }MYMESG;

  18. int main(int argc, char * * argv)
  19. {
  20.         int ret;
  21.         struct msqid_ds msg_info;
  22.     
  23.         char path[1024];
  24.         memset(path, 0, sizeof(path));
  25.         strcpy(path, "/etc/hosts");
  26.         printf("path=[%s]\n", path);
  27.         
  28.         key_t key = 0;
  29.         printf("key=[%x]\n", key);
  30.         /*path必须是已经存在的文件名,将path文件的索引节点号取出,
  31.         前面加上子序号IPCKEY,得到key_t的返回值。
  32.         可以保证两个不同用户下的两组相同程序获得互不干扰的IPC键值
  33.         */
  34.         key = ftok(path, IPCKEY);
  35.         if(key < 0)
  36.         {
  37.                 printf("ftok err!\n");
  38.                 exit(-1);
  39.         }
  40.         printf("key=[%x]\n", key);
  41.         
  42.         int msgid;
  43.         /*创建 或者 获取一个消息队列ID,返回值就是消息队列标示符。
  44.         IPC_CREAT : 队列不存在,则创建,队列存在,则打开。
  45.         IPC_CREAT|IPC_EXCL : 队列不存在,则创建,队列存在,则报错*/
  46.         msgid = msgget(key, IPC_CREAT|0666);
  47.         if(msgid < 0)
  48.         {
  49.                 printf("msgget err!\n");
  50.                 exit(-1);
  51.         }
  52.         
  53.         MYMESG mymesg2;
  54.         /*msgrcv功能:从消息队列获取消息。每成功获取一条消息,消息队列中的消息就会少一条。
  55.                                     当msgsnd成功返回,内核将与消息队列相关的 struct msqid_ds结构得到更新。
  56.         第3个参数:消息数据的长度:是long之外,结构体其他成员的总长。
  57.         第4个参数:与自定义消息数据类型的,第一个成员的值相对应。
  58.         第5个参数:0:若队列没有指定的消息,则调用msgrcv的进程将会挂起阻塞,直到队列中有指定的消息,或者队列被删除了,msgrcv出错返回
  59.                             IPC_NOWAIT:若队列没有指定的消息,则调用msgrcv的进程将出错返回。
  60.                             MSG_NOERROR:若设置了这个标志,若实际返回的消息大于第3个参数,则该消息被截短,消息已经不再队列中了。
  61.                                                     若未设置这个标志,实际返回的消息又大于第3个参数,则出错返回,消息任留在队列中。
  62.         */
  63.         ret = msgrcv(msgid, &mymesg2, sizeof(struct mymesg)-sizeof(long), 1, 0);
  64.         printf("ret=[%d]\n", ret);
  65.         if(ret < 0)
  66.         {
  67.                 printf("msgrcv err!\n");
  68.                 exit(-1);
  69.         }
  70.         printf("从消息队列中取得一条数据如下:\n");
  71.         printf("mymesg2.mtype=[%d]\n", mymesg2.mtype);
  72.         printf("mymesg2.name=[%s]\n", mymesg2.name);
  73.         printf("mymesg2.value=[%s]\n", mymesg2.value);
  74.         
  75.         /*msgctl函数
  76.         IPC_STAT:取得此队列的struct msqid_ds结构,存放在msg_info中
  77.         IPC_SET:按照msg_info 结构中的值,设置此队列的 struct msqid_ds结构
  78.         IPC_RMID:从系统中删除消息队列,及仍然留在该队列中的所有的数据,这种删除是立即生效的
  79.         */
  80.         ret = msgctl(msgid, IPC_STAT, &msg_info);
  81.         if(ret < 0)
  82.         {
  83.                 printf("msgctl err!\n");
  84.                 exit(-1);
  85.         }
  86.         printf("从消息队列中取走了1条消息之后的属性:\n");
  87.         printf("the message number is:队列中消息的个数:[%d]\n",msg_info.msg_qnum);
  88.         printf("the crow max number is:系统限制队列的最大数:[%d]\n",msg_info.msg_qbytes);
  89.         printf("the last message's pid is:最后向消息队列中发送数据的进程号:[%d]\n",msg_info.msg_lspid);
  90.         printf("the last receve meassage's pid is:最后从消息队列中取得数据的进程号:[%d]\n",msg_info.msg_lrpid);
  91.         printf("the last send time is:最后向消息队列中发送数据的时间:[%s]\n",ctime(&(msg_info.msg_stime)));
  92.         printf("the last receve time is:最后从消息队列中取得数据的时间:[%s]\n",ctime(&(msg_info.msg_rtime)));
  93.         printf("the last changed time is:消息队列最后发生数据变化的时间:[%s]\n",ctime(&(msg_info.msg_ctime)));
  94.         printf("the message UID is 用户ID: [%d]\n",msg_info.msg_perm.uid);
  95.         printf("the message GID is 组ID: [%d]\n",msg_info.msg_perm.gid);
  96.         
  97.         while(1);
  98.     
  99.         return 0;
  100. }

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

上一篇:popen用法

下一篇:信号量集合

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