题目一:要求AB进程做通信
1.A进程发送一句话,B进程接收打印
2.然后B进程发送给A进程一句话,A进程接收打印
3.重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
4.在1,2,3的基础上实现,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>
#include <unistd.h>
//消息包结构体
struct msgbuf
{
long mtype; //消息类型,必须大于0
char mtext[128]; //消息内容,该成员类型可变
};
void *callBack_send(void *arg)
{
int msqid=*(int*)arg;
//消息包
struct msgbuf snd;
snd.mtype=1; //消息类型
while(1)
{
printf("A进程说>>>");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1]=0;
//以阻塞的方式发送,消息队列满了,阻塞
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0)<0)
{
perror("msgsnd");
break;
}
if(strcasecmp(snd.mtext, "quit") == 0)
exit(1);
}
pthread_exit(NULL);
}
void *callBack_receive(void *arg)
{
int msqid=*(int*)arg;
//消息包
struct msgbuf rcv;
ssize_t res=0;
while(1)
{
res=msgrcv(msqid,&rcv,sizeof(rcv.mtext),2,0);
if(res<0)
{
perror("msgcrv");
break;
}
if(strcasecmp(rcv.mtext, "quit") == 0)
{
printf("\n");
exit(1);
}
printf("\rA进程收到B进程说:%s\n",rcv.mtext);
printf("A进程说>>>");
fflush(stdout);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid < 0)
{
perror("msgget");
return -1;
}
pthread_t tid1, tid2;
//创建一个线程,发送消息包
if(pthread_create(&tid1, NULL,callBack_send,(void*)&msqid) != 0)
{
perror("pthread_create");
return -1;
}
//创建一个线程,接受消息包
if(pthread_create(&tid2, NULL, callBack_receive, (void*)&msqid) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, 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>
#include <unistd.h>
//消息包结构体
struct msgbuf
{
long mtype; //消息类型,必须大于0
char mtext[128]; //消息内容,该成员类型可变
};
void *callBack_receive(void *arg)
{
int msqid=*(int*)arg;
//消息包
struct msgbuf rcv;
ssize_t res=0;
while(1)
{
res=msgrcv(msqid,&rcv,sizeof(rcv.mtext),1,0);
if(res<0)
{
perror("msgcrv");
break;
}
if(strcasecmp(rcv.mtext, "quit") == 0)
{
printf("\n");
exit(1);
}
printf("\rB进程收到A进程说:%s\n",rcv.mtext);
printf("B进程说>>>");
fflush(stdout);
}
pthread_exit(NULL);
}
void *callBack_send(void *arg)
{
int msqid=*(int*)arg;
struct msgbuf snd;
snd.mtype=2; //消息类型
while(1)
{
printf("B进程说>>>");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1]=0;
//以阻塞的方式发送,消息队列满了,阻塞
if(msgsnd(msqid,&snd,sizeof(snd.mtext),0)<0)
{
perror("msgsnd");
break;
}
if(strcasecmp(snd.mtext, "quit") == 0)
exit(1);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//计算key值
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
//创建一个消息队列
int msqid = msgget(key,IPC_CREAT|0664);
if(msqid < 0)
{
perror("msgget");
return -1;
}
pthread_t tid1, tid2;
//创建一个线程,接受消息包
if(pthread_create(&tid2, NULL, callBack_receive, (void*)&msqid) != 0)
{
perror("pthread_create");
return -1;
}
//创建一个线程,发送消息包
if(pthread_create(&tid1, NULL,callBack_send,(void*)&msqid) != 0)
{
perror("pthread_create");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
运行结果
题目二:A进程写入一个整型,在该整型后,写入一个字符串。B进程将共享内存中的整型以及字符串读取出来;
实现代码
进程A
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
void *shmaddr=shmat(shmid,NULL,0);
if(*(int*)shmaddr<0)
{
perror("shmat");
return -1;
}
int *a = (int*)shmaddr;
printf("请输入一个整型:");
scanf("%d",a);
getchar();
char *b = (char*)(a+1);
printf("请输入一个字符串:");
fgets(b,128,stdin);
printf("写入成功\n");
return 0;
}
进程B
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, const char *argv[])
{
key_t key = ftok("./",1);
if(key < 0)
{
perror("ftok");
return -1;
}
int shmid = shmget(key,32,IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
void *shmaddr=shmat(shmid,NULL,0);
if(*(int*)shmaddr<0)
{
perror("shmat");
return -1;
}
int *a = (int*)shmaddr;
printf("整型:%d\n",*a);
char *b = (char*)(a+1);
printf("字符串:%s",b);
return 0;
}