免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3623 | 回复: 6
打印 上一主题 下一主题

[C] 建立消息队列后查看里面的消息总是64条,为什么啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-13 16:39 |只看该作者 |倒序浏览
毕业设计做的是基于消息队列的进程间通信,由于要把进程的ID号发送到消息队列中,下面是代码

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<stdio.h>
  4 #include<stdlib.h>
  5 #include<string.h>
  6 #include<fcntl.h>
  7 #include<sys/ipc.h>
  8 #include<sys/msg.h>
  9 #include<sys/stat.h>
10 #include<unistd.h>
11 #define BUF_SIZE     256
12 #define PROJ_ID      32
13 #define PATH_NAME    "/home"
14
15
16 int main(void)
17 {
18         /*用户自定义消息缓冲区*/
19         struct msgbuffer{
20         long msgtype;
21         char msgtext[BUF_SIZE];
22         }msgbuf;
23
24         char p[50];
25         pid_t pr,pc;
26         key_t msgkey;
27         int msgid;  /*消息队列标志*/
28         int msglen;
29
30         /*调用fork函数,其返回值为pr*/
31         pr=fork();
32         /*通过pr的值来判断fork函数的返回情况,首先进行出错处理*/
33         if(pr==-1){
34                 perror("fork");
35                 exit(1);
36         }
37         else if(pr==0)
38         {
39                 pc=getpid();
40                 printf("%d\n",getpid());
41                 sprintf(p,"%d",pc);
42                 printf("%s\n",p);
43
44                 /*获取键值*/
45                 if((msgkey=ftok(PATH_NAME,PROJ_ID))==-1){
46                         perror("ftok error!\n");
47                         exit(1);
48                 }
49                 /*创建消息队列*/
50                 if((msgid=msgget(msgkey,IPC_CREAT|0660))==-1){
51                         perror("msgget error!\n");
52                         exit(1);
53                 }
54
55
56                 while(1)
57                 {
58                         msgbuf.msgtype=2;
59                         msglen=sizeof(struct msgbuffer)-4;
60                         strcpy(msgbuf.msgtext,p);
61                         if(msgsnd(msgid,&msgbuf,msglen,IPC_NOWAIT)==-1)
62                         {
63                                 perror("msgsnd error\n");
64                                 exit(1);
65                         }
66
67                 }
68                 /*if(msgctl(msgid,IPC_RMID,NULL)==-1)
69                 {
70                         perror("delete msg error!\n");
71                         exit(1);
72                 }*/
73         }
74         else exit(0);
75 }
76
  

刚开始的时候程序运行成功,后来运行了几次或者是几十次吧(具体忘记了)
再运行程序的结果是:
6942
6942
msgsnd error
: Resource temporarily unavailable
ipcs 查看:消息队列中的消息是64


然后将原来的消息队列删除,如代码68-72,此时ipcs查看没有消息队列

重新运行程序,出现了相同key、不同msgid的消息队列,可是消息队列中还是64条消息。

然后我又删除了消息队列,把消息队列的名字改变了一下,然后fotk函数中的path也改变了

重新运行程序,出现了不同key、不同msgid的消息队列,可是消息队列中还是64条消息。

到底是怎么回事呢??z这个问题困扰我很久了。。。。


大家帮忙指导一下,万分感谢!!

[ 本帖最后由 cyg19860205 于 2009-4-13 17:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-13 16:46 |只看该作者
汗,你这个程序只有发送没有接收,消息队列满了当然不能再放数据了,你要去从消息队列获取数据啊

论坛徽章:
0
3 [报告]
发表于 2009-04-13 17:18 |只看该作者

回复 #2 jinmiaobis 的帖子

不是的, 还有server端程序,负责接收消息的

论坛徽章:
0
4 [报告]
发表于 2009-04-13 17:29 |只看该作者
明白了。。。。

论坛徽章:
0
5 [报告]
发表于 2009-04-13 22:52 |只看该作者
麻烦你明白了还是解释一下吧。^_^

论坛徽章:
0
6 [报告]
发表于 2009-04-14 14:22 |只看该作者

回复 #5 handsome-king 的帖子

昨天一直没在,现在正要证明我的想法是不是对的

我想是不是建立的子进程,一直循环的在消息队列中发送消息,而接收的守护进程没有及时接收,而导致消息队列资源阻塞?

我想应该实现发送和接收消息的同步,不知道我想的是不是对的???

论坛徽章:
0
7 [报告]
发表于 2009-04-14 15:43 |只看该作者
现在弄明白了,不是这个程序的问题,是另一个server端的守护进程出现了问题。。。

守护进程运行后,在进程表中不存在守护进程,导致被守护的进程不同的向消息队列中发送消息,而server端没有接收消息,在一段时间后致使消息队列阻塞
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP