要求AB进程做通信
1. A进程发送一句话,B进程接收打印
2. 然后B进程发送给A进程一句话,A进程接收打印
3. 重复1,2步骤,直到A进程或者B进程收到quit,退出AB进程;
2)根据以上基础上实现,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];
};
void *func(void *arg)
{
struct msgbuf rcv;
ssize_t res=0;
while(1)
{
res=msgrcv(*(int*)arg,&rcv,sizeof(rcv.mtext),0,0); //阻塞方式
if(res<0)
{
perror("msgrcv");
break;
}else if(res==0)
{
exit(0);
}else
{
if(strcasecmp(rcv.mtext,"quit")==0)
{
exit(0);
}
}
printf("\nres = %ld [%ld :%s]\n",res,rcv.mtype,rcv.mtext);
printf("请输入>>>");
fflush(stdout);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
key_t key=ftok("./",1);
if(key<0)
{
perror("ftok");
return -1;
}
key_t key1=ftok("./",2);
if(key<0)
{
perror("ftok");
return -1;
}
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid<0)
{
perror("msgget");
return -1;
}
int msqid1=msgget(key1,IPC_CREAT|0664);
if(msqid1<0)
{
perror("msgget");
return -1;
}
pthread_t tid;
if(pthread_create(&tid,NULL,func,(void*)&msqid1)!=0)
{
perror("pthread_create");
return -1;
}
struct msgbuf snd;
//snd.mtype=1;
while(1)
{
printf("msqid = %d\n",msqid);
printf("请输入>>>");
scanf(" %ld",&snd.mtype);
getchar();
printf("请输入>>>");
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");
return -1;
}
if(strcasecmp(snd.mtext,"quit")==0)
{
exit(0);
}
printf("msgsnd success\n");
}
pthread_join(tid,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];
};
void * func(void *arg)
{
struct msgbuf snd;
//snd.mtype=1;
while(1)
{
printf("msqid = %d\n",*(int*)arg);
printf("请输入>>>");
scanf("%ld",&snd.mtype);
getchar();
printf("请输入>>>");
fgets(snd.mtext,sizeof(snd.mtext),stdin);
snd.mtext[strlen(snd.mtext)-1]=0;
if(msgsnd(*(int*)arg,&snd,sizeof(snd.mtext),0)<0)
{
perror("msgsnd");
break;
}
if(strcasecmp(snd.mtext,"quit")==0)
{
exit(0);
}
printf("msgsnd success\n");
}
}
int main(int argc, const char *argv[])
{
key_t key=ftok("./",1);
if(key<0)
{
perror("ftok");
return -1;
}
key_t key1=ftok("./",2);
if(key<0)
{
perror("ftok");
return -1;
}
int msqid1=msgget(key1,IPC_CREAT|0664);
if(msqid1<0)
{
perror("msgget");
return -1;
}
pthread_t tid;
if(pthread_create(&tid,NULL,func,(void*)&msqid1)!=0)
{
perror("pthread_create");
return -1;
}
int msqid=msgget(key,IPC_CREAT|0664);
if(msqid<0)
{
perror("msgget");
return -1;
}
struct msgbuf rcv;
ssize_t res=0;
while(1)
{
res=msgrcv(msqid,&rcv,sizeof(rcv.mtext),0,0); //阻塞方式
if(res<0)
{
perror("msgrcv");
return -1;
}else if(res==0)
{
exit(0);
}else
{
if(strcasecmp(rcv.mtext,"quit")==0)
{
exit(0);
}
}
printf("\n");
printf("res = %ld [%ld :%s]\n",res,rcv.mtype,rcv.mtext);
printf("请输入>>>");
fflush(stdout);
}
pthread_join(tid,NULL);
return 0;
}
运行结果
1. A进程写入一个整型,在该整型后,写入一个字符串
2. B进程将共享内存中的整型以及字符串读取出来;
//进程A
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[])
{
key_t key=ftok("./",'a');
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n", key);
//创建共享内存
int shmid = shmget(key, 32, IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
printf("shmid = %d\n", shmid);
//共享内存的映射
void* shmaddr = shmat(shmid, NULL, 0);
int* n=(int*)shmaddr;
*n=10;
n++;
char* pstr = (char*)n;
strcpy(pstr, "hello world");
//system("ipcs -m");
return 0;
}
//进程B
#include<stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//创建key值
key_t key = ftok("./", 'a');
if(key < 0)
{
perror("ftok");
return -1;
}
printf("key = %#x\n", key);
//创建共享内存
int shmid = shmget(key, 32, IPC_CREAT|0664);
if(shmid < 0)
{
perror("shmget");
return -1;
}
printf("shmid = %d\n", shmid);
//共享内存的映射
void* shmaddr = shmat(shmid, NULL, 0);
int* n=(int*)shmaddr;
printf("%d\n",*n);
n++;
char* pstr = (char*)n;
printf("%s\n",pstr);
//system("ipcs -m");
return 0;
}
运行结果