主要使用消息队列,以及父子进程,实现三人之间的简单信息发送和接受。
lucy.c文件
lucy.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define BOB 1
#define LUCY 2
#define dsb 3
typedef struct msg{
long msgtype;
char name[20];
char content[1024];
}MSG;
int main(int argc,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 -1;
}
//收发进程
pid_t pid=fork();
if(pid==0)
{
//收消息
MSG rcvmsg={};
while(1)
{
int ret=msgrcv(msgid,&rcvmsg,sizeof(MSG)-sizeof(long),LUCY,0);
if(ret<0)
{
perror("msgrcv");
return -1;
}
printf("form %s-content:%s\n",rcvmsg.name,rcvmsg.content);
memset(&rcvmsg,0,sizeof(MSG));
}
}else if(pid>0){
//发消息
char name[20]={};
char buf[1024]={};
MSG sndmsg={};
while(1)
{
printf("who you want send msg:");
memset(name,0,sizeof(name));
scanf("%s",name);
memset(&sndmsg,0,sizeof(MSG));
if(strcmp(name,"bob")==0)
{
sndmsg.msgtype=BOB;
}else if(strcmp(name,"dsb")==0)
{
sndmsg.msgtype=dsb;
}
strcpy(sndmsg.name,"lucy");
printf("what you wnat to send?");
scanf("%s",buf);
strcpy(sndmsg.content,buf);
msgsnd(msgid,&sndmsg,sizeof(MSG)-sizeof(long),0);
}
}
return 0;
}
bob.c文件
bob.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define BOB 1
#define LUCY 2
#define dsb 3
typedef struct msg{
long msgtype;
char name[20];
char content[1024];
}MSG;
int main(int argc,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 -1;
}
//收发进程
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 -1;
}
else if(ret > 0)
{
printf("ret=%d\n",ret);
printf("form %s-content:%s\n",rcvmsg.name,rcvmsg.content);
memset(&rcvmsg,0,sizeof(MSG));
}else
{
}
}
}else if(pid>0){
//发消息
char name[20]={};
char buf[1024]={};
MSG sndmsg={};
while(1)
{
printf("who you want 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,"dsb")==0)
{
sndmsg.msgtype=dsb;
}
strcpy(sndmsg.name,"bob");
printf("what you wnat to send?");
scanf("%s",buf);
strcpy(sndmsg.content,buf);
msgsnd(msgid,&sndmsg,sizeof(MSG)-sizeof(long),0);
}
}
return 0;
}
第三人:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
#define BOB 1
#define LUCY 2
#define dsb 3
typedef struct msg{
int msgtype;
char name[20];
char content[1024];
}MSG;
int main(int argc,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 -1;
}
//收发进程
pid_t pid=fork();
if(pid==0)
{
//收消息
MSG rcvmsg={};
while(1)
{
int ret=msgrcv(msgid,&rcvmsg,sizeof(MSG)-sizeof(long),dsb,0);
if(ret<0)
{
perror("msgrcv");
return -1;
}
printf("form %s-content:%s\n",rcvmsg.name,rcvmsg.content);
memset(&rcvmsg,0,sizeof(MSG));
}
}else if(pid>0){
//发消息
char name[20]={};
char buf[1024]={};
MSG sndmsg={};
while(1)
{
printf("who you want send msg:");
memset(name,0,sizeof(name));
scanf("%s",name);
memset(&sndmsg,0,sizeof(MSG));
if(strcmp(name,"bob")==0)
{
sndmsg.msgtype=BOB;
}else if(strcmp(name,"lucy")==0)
{
sndmsg.msgtype=LUCY;
}
strcpy(sndmsg.name,"dsb");
printf("what you wnat to send?");
scanf("%s",buf);
strcpy(sndmsg.content,buf);
msgsnd(msgid,&sndmsg,sizeof(MSG)-sizeof(long),0);
}
}
return 0;
}
运行程序,就可以实现简单的聊天了: