在练习进程间消息队列时,信息一直无法输出。
源代码:
int ret = msgrcv(msgid,&rcvmsg,sizeof(MSG)-sizeof(long),BOB,0);//接受信息
if(ret < 0)//判断是否接受成功
{
perror("msgrcv");
return -3;
}
printf("from %s:%s",rcvmsg.name,rcvmsg.content);//打印接受的信息
memset(&rcvmsg,0,sizeof(MSG));//重置结构体中的数据
在Linux中printf函数因为行缓冲的原因如果不加\n就无法及时地将信息输出到屏幕中。如果未用\n那么printf函数将会一直打印到行满才会自动刷新输出流。电脑为了减少访问次数,才会设置出这种问题。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
typedef struct msg
{
long msgtype;
char name[15];
char content[1024];
}MSG;
#define BOB 1
#define LUCY 2
#define JACK 3
int main(int arg,char * argv[])
{
//
key_t key = ftok(".",3344);
if(key<0)
{
perror("ftok");
return -1;
}
int msgid = msgget(key,IPC_CREAT | 0666);
if(msgid<0)
{
perror("msgget");
return -2;
}
//jingcheng
pid_t pid = fork();
if(pid==0)
{
MSG rcvmsg = {};
while(1)
{
int ret = msgrcv(msgid,&rcvmsg,sizeof(MSG)-sizeof(long),BOB,0);
if(ret < 0)
{
perror("msgrcv");
return -3;
}
printf("from %s:%s\n",rcvmsg.name,rcvmsg.content);
memset(&rcvmsg,0,sizeof(MSG));
}
}
else if(pid>0)
{
char name[15]={};
char buf[1024]={};
MSG sndmsg = {};
while(1)
{
printf("who you send msg:");
memset(name,0,sizeof(name));
scanf("%s",name);
memset(&sndmsg,0,sizeof(MSG));
if(strcmp(name,"lucy")==0)
{
sndmsg.msgtype = LUCY;
}
else if(strcmp(name,"jack")==0)
{
sndmsg.msgtype = JACK;
}
strcpy(sndmsg.name,"bob");
printf("what you want to send?\n");
scanf("%s",buf);
strcpy(sndmsg.content,buf);
msgsnd(msgid,&sndmsg,sizeof(MSG)-sizeof(long),0);
}
}
return 0;
}