当前位置: 技术问答>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时产生的。
signal(SIGINT, terminate_handler);
signal(SIGTERM, terminate_handler);
这个是捕获SIGINT,SIGTERM信号,转到terminate_handler函数处理。这两个信号一般是在你用Ctrl-c和kill时产生的。
|
自己搞明白了?好
|
lz好像是那个问fifo的马甲