此程序实现两个普通进程间通过共享内存来进行通信,共享内存能够进行大数据量的通信,这一点事消息队列无法比拟的。在这里同时使用了信号量来保证两个进程间的读写同步。
发送端源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <string.h>
int main()
{
key_t key,key1;
int running=1;
int shmid;
int semid;
int value;
void *sharem=NULL;
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_flg=SEM_UNDO;
key=ftok(".",12324);
if((semid=semget(key,1,IPC_CREAT|0777))==-1)
{
perror("semget");
exit(1);
}
if(semctl(semid,0,SETVAL,0)==-1)
{
perror("semctl");
if(semctl(semid,0,IPC_RMID,0)==-1)
{
perror("semctl()");
exit(1);
}
exit(1);
}
printf("sem init sucessful!\n");
key1=ftok(".",1254);
if((shmid=shmget(key1,2000,IPC_CREAT|SHM_R|SHM_W))==-1)
{
perror("shmget");
exit(1);
}
if((sharem=shmat(shmid,NULL,0))==NULL)
{
perror("shmat");
if(shmctl(shmid,IPC_RMID,NULL)==-1)
perror("shmctl");
exit(1);
}
while(running)
{
if((value=semctl(semid,0,GETVAL))==0)
{
printf("write data operate\n");
printf("please input something\n");
char buffer[512]="";
fgets(buffer,512,stdin);
strcpy((char*)sharem,buffer);
sem_b.sem_op=1;
if(semop(semid,&sem_b,1)==-1)
{
perror("semop");
exit(1);
}
if(!strncmp(buffer,"end",3))
{
printf("the process will exit");
running=0;
}
}
}
sleep(10);
return 0;
}
接收端源代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/types.h>
#include <string.h>
int main()
{
key_t key,key1;
int running=1;
int shmid;
int semid;
int value;
void *sharem=NULL;
struct sembuf sem_b;
sem_b.sem_num=0;
sem_b.sem_flg=SEM_UNDO;
key=ftok(".",12324);
if((semid=semget(key,1,IPC_CREAT|0777))==-1)
{
perror("semget");
exit(1);
}
/*
if(semctl(semid,0,SETVAL,0)==-1)
{
perror("semctl");
if(semctl(semid,0,IPC_RMID,0)==-1)
{
perror("semctl()");
exit(1);
}
exit(1);
}*/
printf("sem init sucessful!\n");
key1=ftok(".",1254);
if((shmid=shmget(key1,2000,IPC_CREAT|SHM_R|SHM_W))==-1)
{
perror("shmget");
exit(1);
}
if((sharem=shmat(shmid,NULL,0))==NULL)
{
perror("shmat");
if(shmctl(shmid,IPC_RMID,NULL)==-1)
perror("shmctl");
exit(1);
}
while(running)
{
if(semctl(semid,0,GETVAL)==1)
{
printf("receive data operate\n");
char buffer[512]="";
strcpy(buffer,(char*)sharem);
printf("the receive data is:%s\n",buffer);
sem_b.sem_op=-1;
if(semop(semid,&sem_b,1)==-1)
{
perror("semop");
exit(1);
}
if(0==strncmp(buffer,"end",3))
{
running =0;
printf("the process will exit\n");
}
}
//printf("");
}
shmdt(sharem);
if(shmctl(shmid,IPC_RMID,0)==-1)
{
perror("shmctl");
exit(1);
}
if(semctl(semid,IPC_RMID,0)==-1)
{
perror("semctl");
exit(1);
}
return 0;
}