当前位置:  技术问答>linux和unix

[急切求助]使用SYS V消息队列实现进程间通讯问题!!!

    来源: 互联网  发布时间:2016-09-18

    本文导语:  准备实现的功能: 进程CAP向队列写一条记录,进程MAP读该记录,并把处理结果写入队列让进程CAP来读。 要求CAP不阻塞,并且进程MAP退出或出现异常不影响CAP的运行。 刚刚测试时,进程CAP和进程MAP共用消息队列: 调试时碰到...

准备实现的功能:
进程CAP向队列写一条记录,进程MAP读该记录,并把处理结果写入队列让进程CAP来读。
要求CAP不阻塞,并且进程MAP退出或出现异常不影响CAP的运行。


刚刚测试时,进程CAP和进程MAP共用消息队列:
调试时碰到的问题:
进程CAP读写队列的最后一位参数是IPC_NOWAIT;
进程MAP读写队列的最后一位参数是0;

单独运行进程A时,进程CAP连续写三次,连续读两次,
但是只能读出最后一次写进去的记录。
感觉应该可以把写进去的3条都读出来。
(进程MAP可以把三条记录都读出来)

启动进程CAP和MAP之后,退出进程CAP,
进程MAP写一次,居然可以连续两次都读出来?
不是读完之后系统会自动清除消息么?
(难道要进程CAP读完之后才清除)

/****** cap.c主要代码 ******/
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PROJID 0xFF
#define SNDMSG 1
#define RCVMSG 2
int mqid;

void terminate_handler(int signo)
{
msgctl(mqid, IPC_RMID, NULL);
exit(0);
}

int main(void)
{
char filenm[] = "shared-file.txt";
key_t mqkey;
struct msgbuf {
         long mtype;     /* message type, must be > 0 */
                char mtext[256];  /* message data */
        }msg;
int ret;

mqkey = ftok(filenm, PROJID);
if (mqkey == -1) {
perror("ftok error: ");
exit(-1);
}

mqid = msgget(mqkey, IPC_CREAT | IPC_EXCL | 0666);
if (mqid == -1) {
perror("msgget error: ");
exit(-1);
}

signal(SIGINT, terminate_handler);
signal(SIGTERM, terminate_handler);

while (1) {       
             strcpy(msg.mtext,"Hello,Map1111!");  
             printf("msg To Map: %sn", msg.mtext);  
msg.mtype = SNDMSG;
              msgsnd(mqid, &msg, strlen(msg.mtext) + 1, IPC_NOWAIT); 
   
             strcpy(msg.mtext,"Hello,Map22222!");  
             printf("msg To Map: %sn", msg.mtext);  
msg.mtype = SNDMSG;
              msgsnd(mqid, &msg, strlen(msg.mtext) + 1, IPC_NOWAIT); 

             strcpy(msg.mtext,"Hello,Map333333!");  
             printf("msg To Map: %sn", msg.mtext);  
msg.mtype = SNDMSG;
              msgsnd(mqid, &msg, strlen(msg.mtext) + 1, IPC_NOWAIT);
              
              sleep(2); 
              /*单独运行该进程时*/
              /*自己写入3条消息,只能读出最后一次写的消息,应该都读出来啊???*/
              /*另外一个进程可以把三条消息都读出来*/        
              msgrcv(mqid, &msg, 256, RCVMSG, IPC_NOWAIT);
printf("  msg From Map: %sn", msg.mtext);
              msgrcv(mqid, &msg, 256, RCVMSG, IPC_NOWAIT);
printf("  msg From Map: %sn", msg.mtext); 
}
}

//////////////////////////////////////////////////////////////
/****** map.c主要代码 ******/
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PROJID 0xFF
#define SNDMSG 1
#define RCVMSG 2

int main(void)
{
char filenm[] = "shared-file.txt";
int mqid;
key_t mqkey;
struct msgbuf {
         long mtype;     /* message type, must be > 0 */
                char mtext[256];  /* message data */
        }msg;
int ret;

mqkey = ftok(filenm, PROJID);
if (mqkey == -1) {
perror("ftok error: ");
exit(-1);
}

mqid = msgget(mqkey, 0);
if (mqid == -1) {
perror("msgget error: ");
exit(-1);
}

while (1) {
              /*单独运行该进程时*/ 
              /*自己写入一条消息,可以被读两次!!!*/ 
              /*难道自己写的消息,读完之后系统不自动清除???*/ 
msgrcv(mqid, &msg, 256, SNDMSG, 0);
              sleep(1); 
printf("msg From CAP: %sn", msg.mtext);
              msgrcv(mqid, &msg, 256, SNDMSG, 0);
printf("msg From CAP: %sn", msg.mtext); 

              strcpy(msg.mtext,"Hello,CAP!"); 
              printf("  Peter: msg To CAP: %sn", msg.mtext);
msg.mtype = RCVMSG;
msgsnd(mqid, &msg, strlen(msg.mtext) + 1, 0);
}
}

|
消息队列没用过,6楼的代码倒是知道
signal(SIGINT, terminate_handler);
signal(SIGTERM, terminate_handler);
这个是捕获SIGINT,SIGTERM信号,转到terminate_handler函数处理。这两个信号一般是在你用Ctrl-c和kill时产生的。

|
自己搞明白了?好

|
lz好像是那个问fifo的马甲

    
 
 

您可能感兴趣的文章:

  • unix/linux平台下进程间通信的问题(消息队列)(紧急求助)
  • [急切求助]IPC消息队列写失败时,如何清空队列中的数据?
  • (求助)IPC 消息队列 编译问题
  • Linux系统编程求助:消息队列
  • 我想让vfork后就execl一进程,同时让execl出来的进程之间能相互通信,求助
  • 求助:信号 --13 进程中断
  • 【求助】多进程中 内核信号量无效?
  • 关于僵死进程,求助
  • 新人求助,进程调度的问题.
  • 求助 linux进程管理
  • linux下进程并发问题。急!!!求助!!!
  • 菜鸟求助, Linux进程的问题
  • 紧急求助,关于kill进程 , 大家帮帮忙啊 !!!
  • [求助]查看监听端口所属进程问题
  • 求助:怎样获得freebsd中的进程pid?
  • ■■求助■■ 如何查看一个进程拥有的线程数量???
  • 求助: 进程调度内核分析
  • 求助(SHELL 脚本)进程的唯一性检查
  • [求助]popen 函数引起 shell 调用, sh 成为僵尸进程.
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • 求助:父进程被kill掉以后,子进程在任务表中所占内存是怎样释放的?
  • 求助:AIX5L,如何得到被某个进程打开的文件名称?
  • [求助]在hp-unix如何删除本进程的环境变量。
  • 求助:在什么情况下需要用到进程编程?谢谢!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 菜鸟求助:如何在 JAVA APPLET 里感知到鼠标的双击消息?
  • 在线求助!关于如何使用“信号”的方式来响应键盘按下的消息!在线急盼回复!
  • 高分求助高分求助高分求助高分求助高分求助高分求助
  • 怎样读取HZK24S前十区的内容啊???求助求助
  • 紧急求助!紧急求助!
  • 【求助】iplanet问题,求助高手解答!
  • 菜鸟求助,solaris下计算问题求助
  • 【求助】SOS紧急求助..............极为简单的问题...跪求....
  • 高分求助啊!求助SUSE 10.0 不能上网.
  • 急急急急急急急啊,紧急求助啊!!!!!满分求助啊!!!!!!
  • 求助:linux下 vim的配置(高分求助)
  • red hat怎么安装gcc啊!总是出错,求助求助啊!!!yum源怎么改啊!!
  • 求助~~求助 ~~linux文件读写问题
  • 求助,安装了红帽子后进不了
  • 新装linux求助
  • linux的 iptables问题求助
  • (高分求助)请问,那里有软件开发的<设计文档>
  • 一个简单的问题,高分求助!!!
  • 紧急求助:Unix下给文件夹重命名用什么命令?谢谢!!!!
  • VJ的一个问题,高分求助,熟悉VJ得请进!
  • 高分求助
  • 紧急求助java多线程编程!!!!!!!!!!!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3