您的位置:首页 > 其它

进程间通信--消息队列(msg)--实现自由通信

2017-05-21 12:14 465 查看
//msg(消息队列)--是将消息按队列的方式组织成的链表
#include"utili.h"
#include<stdio.h>
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/sem.h>
#include<sys/msg.h>
#include<string.h>
#include<stdlib.h>

//............ser.c
#include"utili.h"
#define SEND_TYPE 100
#define RECV_TYPE 200

typedef struct MsgType
{
long msg_type;
char msg_buf[256];

}MsgType;

int main()
{
key_t msg_key;
msg_key = ftok("mymsg",0xff);
if(msg_key == -1)
{
perror("ftok");
exit(1);
}

int msg_id = msgget(msg_key, IPC_CREAT|0755);
if(msg_id == -1)
{
perror("msgget");
exit(1);
}
MsgType msg;
pid_t pid1,pid2;
pid1=fork();
int status;
if(pid1 == -1)
{
printf("create fork error\n");
exit(1);
}
else if(pid1 == 0)
{
while(1)
{
msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
printf("Cli:>%s\n",msg.msg_buf);
}
}
else if(pid1 > 0)
{
pid2 = fork();
if(pid2 == -1)
{
printf("create fork2 erroe\n");
exit(1);
}
if(pid2 == 0)
{
while(1)
{
printf("Ser:>");
scanf("%s",msg.msg_buf);
if(strcmp(msg.msg_buf,"quit") == 0)
{
close(msg_id);
break;
}
msg.msg_type = SEND_TYPE;
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);
}
}
else if(pid2>0)
{
wait(&status);
}
}
/* ---只能实现你一句我一句
MsgType msg;
while(1)
{
printf("Ser:>");
scanf("%s",msg.msg_buf);
msg.msg_type = SEND_TYPE;
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);

msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
printf("Cli:>%s\n",msg.msg_buf);
}
*/
return 0;
}

#..............cli.c
#include"utili.h"
#define SEND_TYPE  200
#define RECV_TYPE  100
/*int  msgsnd(int msqid,const void *ptr,size_t length,int flag);
ID号   发送消息的指针    长度      访问标记
其中ptr是一个结构指针,模板如下:
*/
typedef struct MsgType
{
long msg_type;
char msg_buf[256];
}MsgType;

int main()
{
key_t msg_key;
msg_key = ftok("mymsg",0xff);
if(msg_key == -1)
{
perror("ftok");
exit(1);
}

int msg_id = msgget(msg_key, 0);
if(msg_id == -1)
{
perror("msgget");
exit(1);
}

MsgType msg;
pid_t pid1,pid2;
pid1=fork();
int status;
if(pid1 == -1)
{
printf("create fork error\n");
exit(1);
}
else   if(pid1 == 0)
{
while(1)
{
msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
printf("Ser:>%s\n",msg.msg_buf);
}
}
else if(pid1 >0)
{
pid2 = fork();
if(pid2 ==-1)

4000
{
printf("create fork2 error\n");
exit(1);
}
else if(pid2 == 0)
{
while(1)
{
printf("Cli:>");
scanf("%s",msg.msg_buf);
if(strcmp(msg.msg_buf,"quit") == 0)
{
close(msg_id);
break;
}
msg.msg_type = SEND_TYPE;
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);
}
}
else if(pid2>0)
{
wait(&status);
}
}
/*   while(1)
{
msgrcv(msg_id, &msg, 256, RECV_TYPE, 0);
printf("Ser:>%s\n",msg.msg_buf);

printf("Cli:>");
scanf("%s",msg.msg_buf);
msg.msg_type = SEND_TYPE;
msgsnd(msg_id, &msg, strlen(msg.msg_buf)+1, 0);
}
*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息