麻烦大家帮我看看这代码
一道典型的Jack 与Rose 的利用消息队列通信的程式
头文件head.h程式,包含的库文件我就不贴了
#define MAX 1024
#define SIZE 100
#define J2R 1001
#define R2J 1002
struct msgbuf
{
long mtype;
char mtext[MAX];
};
void msnd(int msg_id, struct msgbuf *snd, int len, int flag, char *usr_name);
void mrcv(int msg_id, struct msgbuf *rcv, int len, int flag);
jack.c 父进程用于发送消息,子进程用于接收消息
#include "head.h"
int main(int argc, char **argv)
{
int msg_id;
key_t key;
pid_t pid;
struct msgbuf snd;
struct msgbuf rcv;
char *name = "Jack";
key = ftok("/home/nfs/", 123);
if((msg_id = msgget(key, IPC_CREAT | 0666)) < 0)
{
perror("msgget");
exit(1);
}
snd.mtype = J2R;
rcv.mtype = R2J;
bzero(snd.mtext, MAX);
bzero(rcv.mtext, MAX);
if((pid = fork()) < 0)
{
perror("fork");
exit(1);
}
else if(pid > 0)
{
msnd(msg_id, &snd, MAX, 0, name);
kill(pid, SIGKILL);
raise(SIGINT);
}
else
{
mrcv(msg_id, &rcv, MAX, 0);
}
return 0;
}
rose.c 与jack.c大部分一样,这里只贴出不同的部分
char *name = "Rose";
snd.mtype = R2J;
rcv.mtype = J2R;
snd_rcv.c 这里是包含发送消息与接收消息两个函数,而且这里是我的问题所在
#include "head.h"
void msnd(int msg_id, struct msgbuf *snd, int len, int flag, char *usr_name)
{
char input[MAX];
while(1)
{
bzero(snd->mtext, len);
fgets(input, len, stdin);
/*我的需求是当jack端输入quit时,
需要发送“jack is quit”的消息给rose
然后删掉所有关于jack所拥有的msg_id的消息
接着是返回到jack.c里的父进程*/
if(strncmp(input, "quit", 4) != 0)
{
snprintf(snd->mtext, len, "%s: %s", usr_name, input);
}
else
{
snprintf(snd->mtext, strlen(input), "%s is %s", usr_name, input);
}
/*这里是问题所在,当jack端输入"quit"时
应该已经执行 msgsnd函数了
为什么还会被下面的 msgctl函数所影响
导致Rose端接收不到"jack is quit"的消息
反馈的是msgrcv函数的错误: 不合法的参数*/
if(msgsnd(msg_id, snd, strlen(snd->mtext), flag) != -1)
{
if(strncmp(input, "quit", 4) == 0)
{
sleep(2);
if(msgctl(msg_id, IPC_RMID, NULL) < 0)
{
perror("msgctl");
exit(1);
}
break;
}
bzero(snd->mtext, len);
}
else
{
perror("msgsnd");
exit(1);
}
}
return;
}
void mrcv(int msg_id, struct msgbuf *rcv, int len, int flag)
{
while(1)
{
if(msgrcv(msg_id, rcv, len, rcv->mtype, flag) != -1)
{
printf("%s", rcv->mtext);
bzero(rcv->mtext, len);
}
else
{
perror("msgrcv");
exit(1);
}
}
return;
}
[解决办法]
调查下Indentifier Removed 是什么错误,标志被移除了?