首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

麻烦大家帮小弟我看看这代码

2013-06-25 
麻烦大家帮我看看这代码一道典型的Jack 与Rose 的利用消息队列通信的程式头文件head.h程式,包含的库文件我

麻烦大家帮我看看这代码
一道典型的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;
}


[解决办法]

引用:
Quote: 引用:

调试看下,当jack端输入"quit"时
是否执行 msgsnd函数


抱歉,记错了,当jack端发送quit的时候,Rose端先报一个msgrcv函数的错:Indentifier Removed
然后下面一行只打印输出了Jack这个单词


调查下Indentifier Removed 是什么错误,标志被移除了?

热点排行