免费注册 查看新帖 |

Chinaunix

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

[C] 消息队列编程问题。。大家帮忙。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-18 10:37 |只看该作者 |倒序浏览
两个进程A、B通过消息队列通信

怎样判断A、B之间是在否通信呢?

要求是Server端的守护进程守护几个Client端的进程,如果Client端的进程死亡就重启
守护进程与被守护的进程通过消息队列通信

如果两个进程在规定的时间内不在通信了,那么说明进程死亡,就重启

要启动守护进程后,有一个判断的过程(开始被守护进程没有启动时,它们之间是不存在通信的,所以就是Server端守护进程启动并守护Client进程)监视着Client端的进程

我想是不是查看msgtext,如果为空就是没有进行通信??
在编程中,变量以NULL结尾,表示其后没有可用的数据,数据读取在此结束。
  产生 null 的原因是:
  在程序设计中是一个存在的变量的值
  但是你应该问是在什么情况下用的或在什么地方用,
  意义都不一样,表现出来也不一样。
  对一个变量显式地赋值为 null。
  包含 null 的表达式之间的任何操作。

是查看msgtext吗?高手帮忙指导一下

[ 本帖最后由 cyg19860205 于 2009-4-25 16:18 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-18 13:13 |只看该作者
怎么没人回复啊~~

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

回复 #1 cyg19860205 的帖子

you could define a file named 'a' in Prc B,then Prc A writes some bytes to 'a'.
or define a signal to trace the message between A and B. I think...

论坛徽章:
0
4 [报告]
发表于 2009-04-18 16:09 |只看该作者

回复 #3 bsd_lite 的帖子

谢谢您的回复

B创建文件,A写文件,通过查看文件判定有没有通信吗?

不过这样好像是远离了消息队列的通信

现在再看select 函数 ,不知道能不能实现?

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


#define PERMS (S_IRUSR | S_IWUSR)
#define MAXLINE 1024
typedef struct {
     long mtype;
     char mtext[1];
}mymsg_t;
int
main(void)
{
   pid_t pid;
   char test[MAXLINE] = "freebsd ";
   int msqid1;
   
   if ((msqid1 = msgget(IPC_PRIVATE, PERMS)) == -1)
       fprintf(stderr, "Failed to create new private message  queue");
   
   if (pid = fork()){
       char buf[MAXLINE];
       int size;
       if (msgwrite(buf, size) == -1)
          fprintf(stderr, "Failed to write message.");
          break;
        }
     &test[MAXLINE] += "OpenBSD!";   
    }
  printf("%s \n", &text[MAXLINE]);
  return 0;
}

int
msgwrite(void *buf, int len)
{
    int error = 0;
    mymsg_t *mymsg;
    if ((mymsg = (mymsg_t *)malloc(sizeof(mymsg_t) + len - 1)) == NULL)
        return -1;
    memcpy(mymsg->mtext, buf, len);
    mymsg->mtype = 1;
    if (msgsnd(msqid1, mymsg, len, 0) == -1)
        error = errno;
    free(mymsg);
    if (error) {
        errno = error;
        return -1;
    }
    return 0;
}

论坛徽章:
0
6 [报告]
发表于 2009-04-18 17:12 |只看该作者
head of program:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h<
#include <sys/msg.h>
#include <sys/stat.h>

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

回复 #5 bsd_lite 的帖子

您好像没有理解我的意思,建立一个消息队列,两个进程通信(守护进程和被守护进程之间),能通过查看ipcs两个进程在通信,但是现在不要用控制终端查看
用守护进程查看:判定一下两个进程是否还在发送接收消息(在规定的时间内),如果没有发送消息 ,说明被守护的进程已经死亡,然后重启

现在就是想设置一个变量 监视两个进程是否在通信

您的程序好像有好多不对的地方(至少我运行不出来)

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

回复 #6 bsd_lite 的帖子

忘记跟你说谢谢了,呵呵,谢谢你的指导,我是刚学linux下c编程

想用SELECT函数,可是在网上查了查,消息队列不是基于文件描述符的

您的高见呢。。

论坛徽章:
0
9 [报告]
发表于 2009-04-18 17:52 |只看该作者
I think that function "select"  cannot   complish your idea...

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

回复 #9 bsd_lite 的帖子

哦,应该是不能实现

您有好的办法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP