先贴代码:
<msg_client.c>
#include <sys/msg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct my_msg_st{
long int mtype;
long int msize;
char mtext[1024];
}msg_t;
void client(int,int);
int main()
{
int readid,writeid;
readid = msgget((key_t)4321,0);
writeid = msgget((key_t)1234,0);
client(readid,writeid);
msgctl(readid,IPC_RMID,NULL);
msgctl(writeid,IPC_RMID,NULL);
exit(0);
}
void client(int readid,int writeid)
{
int res;
msg_t some_data,some_ack;
char buffer[1024];
for(;;)
{
printf("Message to server:");
fgets(buffer,1024,stdin);
strcpy(some_data.mtext,buffer);
some_data.mtype = 200;
strcpy(some_data.mtext,buffer);
some_data.mtype = 200;
some_data.msize = strlen(some_data.mtext);
printf("Test:%ld,%s\n",some_data.msize,some_data.mtext);
//msgsnd(writeid,(void *)&some_data,some_data.msize+sizeof(long int),0);
msgsnd(writeid,(void *)&some_data,1024+sizeof(long int),0);
if(strncmp(buffer,"end\n",4) == 0)
break;
printf("Message from server:");
res = msgrcv(readid,(void *)&some_ack,1024+sizeof(long int),100,0);
printf("%s\n",some_ack.mtext);
}
}
<msg_server.c>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct my_msg_st{
long int mtype;
long int msize;
char mtext[1024];
}msg_t;
void server(int,int);
int main()
{
int readid,writeid;
readid = msgget((key_t)1234,0666|IPC_CREAT);
writeid = msgget((key_t)4321,0666|IPC_CREAT);
server(readid,writeid);
exit(0);
}
void server(int readid,int writeid)
{
int res,sum=0;
msg_t some_data,some_ack;
for(;;)
{
res = msgrcv(readid,(void *)&some_data,1024+sizeof(long int),200,0);
printf("Read:%d words frome client\n",res);
printf("%s",some_data.mtext);
sum += atoi(some_data.mtext);
printf("SUM:%d\n",sum);
if(strncmp(some_data.mtext,"end\n",4) == 0)
break;
sprintf(some_ack.mtext,"Service recived: %s",some_data.mtext);
some_ack.mtype = 100;
some_ack.msize = strlen(some_ack.mtext);
some_ack.mtype = 100;
some_ack.msize = strlen(some_ack.mtext);
msgsnd(writeid,(void *)&some_ack,sizeof(long int)+some_ack.msize,0);
}
exit(0);
}
先运行msg_server,再运行msg_client,运行结果:
<msg_server>
<msg_client>
问题来了:msgsnd()函数中,第三个参数设置为sizeof(msg_t)-sizeof(long int)时,不会留有尾巴(client发送空消息,server显示的是空白);
第三个参数设置为strlen(some_data.mtext)+sizeof(long int)时,会留有尾巴(client发送空消息,server显示的是上一次或者上上次的残留消息内容)
问题摆出来了,现在还没有思绪这是怎么回事。整个代码只是验证System V中的消息队列机制,client和server间有一对消息队列,负责收发消息。