一、
要求AB进程做通信
-
A进程发送一句话,B进程接收打印
-
B进程发送给A进程一句话,A进程接收打印
-
直到A进程或者B进程收到quit,退出AB进程;
使用消息队列完成AB进程间的通信,并使用多线程保证进程的读写可以连续进行
A进程代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
//消息包结构体
struct msgbuf
{
long mtype; //消息包类型
char mtext[128]; //消息内容
};
int mspid;
int mspid2;
//子线程用于发送消息
void* callBack(void* arg)
{
//发送消息包
while(1)
{
struct msgbuf snd;
/*printf("请输入消息类型>>>");
scanf("%ld", &snd.mtype);
getchar(); //吸收垃圾字符*/
snd.mtype=1;
printf("请输入>>>");
fgets(snd.mtext, sizeof(snd.mtext), stdin);
snd.mtext[strlen(snd.mtext)-1] = 0;
//阻塞方式发送,消息队列满了,阻塞
if(msgsnd(mspid2, &snd, sizeof(snd.mtext), 0) < 0)
{
perror("msgsnd");
return NULL;
}
}
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建消息队列
mspid = msgget(key,IPC_CREAT|0664);
if(mspid < 0)
{
perror("msgget");
return -1;
}
//计算key值
key_t key2 = ftok("./",2);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建消息队列
mspid2 = msgget(key2,IPC_CREAT|0664);
if(mspid < 0)
{
perror("msgget");
return -1;
}
//创建一个线程
pthread_t tid;
if(pthread_create(&tid, NULL, callBack, NULL) != 0)
{
perror("pthread_create");
return -1;
}
//主线程用于读消息
struct msgbuf rcv;
ssize_t res =0;
while(1)
{
//阻塞方式读取消息队列中的消息,msgtyp==0,先进先出的原则
res = msgrcv(mspid,&rcv,sizeof(rcv.mtext),0,0);
if(res<0)
{
perror("msgrcv");
return -1;
}
//退出判断条件
if(strcmp(rcv.mtext,"quit")==0)
{
if(msgsnd(mspid2, &rcv, sizeof(rcv.mtext), 0) < 0)
{
perror("msgsnd");
return -1;
}
break;
}
//若读到的不是quit将读到的字符串打印到终端
printf("\nres= %ld [%ld : %s]\n",res,rcv.mtype,rcv.mtext);
fprintf(stderr,"请输入>>>");
}
printf("\n程序即将退出\n");
//删除写端的消息队列
msgctl(mspid2,IPC_RMID,NULL);
return 0;
}
B进程代码
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/msg.h>
#include<stdlib.h>
#include<string.h>
#include<pthread.h>
//消息包结构体
struct msgbuf
{
long mtype; //消息包类型
char mtext[128]; //消息内容
};
int mspid;
int mspid2;
//子线程用于发送消息
void* callBack(void* arg)
{
//发送消息包
while(1)
{
struct msgbuf snd;
/*printf("请输入消息类型>>>");
scanf("%ld", &snd.mtype);
getchar(); //吸收垃圾字符*/
snd.mtype=1;
printf("请输入>>>");
fgets(snd.mtext, sizeof(snd.mtext), stdin);
snd.mtext[strlen(snd.mtext)-1] = 0;
//阻塞方式发送,消息队列满了,阻塞
if(msgsnd(mspid, &snd, sizeof(snd.mtext), 0) < 0)
{
perror("msgsnd");
return NULL;
}
}
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建消息队列
mspid = msgget(key,IPC_CREAT|0664);
if(mspid < 0)
{
perror("msgget");
return -1;
}
//计算key值
key_t key2 = ftok("./",2);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建消息队列
mspid2 = msgget(key2,IPC_CREAT|0664);
if(mspid < 0)
{
perror("msgget");
return -1;
}
//创建一个线程
pthread_t tid;
if(pthread_create(&tid, NULL, callBack, NULL) != 0)
{
perror("pthread_create");
return -1;
}
//主线程用于读消息
struct msgbuf rcv;
ssize_t res =0;
while(1)
{
//阻塞方式读取消息队列中的消息,msgtyp==0,先进先出的原则
res = msgrcv(mspid2,&rcv,sizeof(rcv.mtext),0,0);
if(res<0)
{
perror("msgrcv");
return -1;
}
//判断退出条件
if(strcmp(rcv.mtext,"quit")==0)
{
if(msgsnd(mspid, &rcv, sizeof(rcv.mtext), 0) < 0)
{
perror("msgsnd");
return -1;
}
break;
}
//若读到的不是quit将读到的字符串打印到终端
printf("\nres= %ld [%ld : %s]\n",res,rcv.mtype,rcv.mtext);
fprintf(stderr,"请输入>>>");
}
printf("\n程序即将退出\n");
//删除写端的消息队列
msgctl(mspid,IPC_RMID,NULL);
return 0;
}
二、
-
A进程写入一个整型,在该整型后,写入一个字符串
-
B进程将共享内存中的整型以及字符串读取出来;
A进程(负责写)
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//创建key值
key_t key = ftok("./",3);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建共享内存
int shmid = shmget(key,24,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmid");
return -1;
}
//读写方式映射共享内存
void* shp = shmat(shmid,NULL,0);
//写入一个整数
int val;
printf("请输入一个整数>>");
scanf("%d",&val);
int* pa = (int*)shp;
*pa=val;
//写入一个字符串
char str[10]="";
printf("请输入一个字符串>>");
scanf("%s",str);
char* ps = (char*)(pa+1);
strcpy(ps,str);
return 0;
}
B进程(负责读)
#include<stdio.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<string.h>
int main(int argc, const char *argv[])
{
//创建key值
key_t key = ftok("./",3);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建共享内存
int shmid = shmget(key,24,IPC_CREAT|0664);
if(shmid<0)
{
perror("shmid");
return -1;
}
//读写方式映射共享内存
void* shp = shmat(shmid,NULL,SHM_RDONLY);
//读出整数
int* pa = (int*)shp;
printf("val=%d\n",*pa);
//读出字符串
char* ps = (char*)(pa+1);
printf("str=%s\n",ps);
return 0;
}