//myipc.h
#include<sys/sem.h>
#include<sys/ipc.h>
#include<sys/types.h>
#include<stdio.h>
#include<sys/shm.h>
union semun
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
//包裹函数
key_t Ftok(const char *filename,int proj_id)
{
key_t key=ftok(filename,proj_id);
if(key==-1)
{
perror("ftok error!\n");
return -1;
}
return key;
}
int Semget(key_t key,int nsms,int semflg)
{
int sem_id=semget(key,nsms,semflg);
if(sem_id==-1)
{
perror("semget error!\n");
return -1;
}
return sem_id;
}
int Shmget(key_t key,size_t size,int shmflg)
{
int shm_id=shmget(key,size,shmflg);
if(shm_id==-1)
{
perror("shmget error!\n");
return -1;
}
return shm_id;
}
服务器(ser.c)
#include"../myipc.h"
int main(int argc,char *argv[])
{
key_t shm_key=Ftok(argv[1],atoi(argv[2]));
int sem_id=Semget(shm_key,2,IPC_CREAT|0755);
int shm_id=Shmget(shm_key,1024*1024,IPC_CREAT|0755);
union semun arg;
arg.val=0;
semctl(sem_id,0,SETVAL,arg);
semctl(sem_id,1,SETVAL,arg);
struct sembuf p={0,-1,0},
v={1,1,0};
void *addr=shmat(shm_id,NULL,0);//0可读可写
if(addr==(void*)(-1))
{
perror("shmat error!\n");
shmctl(shm_id,IPC_RMID,NULL);
return -1;
}
char *Addr=(char *)addr;
while(1)
{
printf("Ser:> ");
scanf("%s",Addr);
semop(sem_id,&v,1);
semop(sem_id,&p,1);
printf("Cli:>%s\n",Addr);
}
shmdt(addr);
semctl(sem_id,0,IPC_RMID);
shmctl(shm_id,IPC_RMID,NULL);
return 0;
}
/
客户端(cli.c)
#include"../myipc.h"
int main(int argc,char *argv[])
{
key_t shm_key=Ftok(argv[1],atoi(argv[2]));
int shm_id=Shmget(shm_key,0,0);
int sem_id=semget(shm_key,0,0);
void *addr=shmat(shm_id,NULL,0);//0可读可写
struct sembuf p={1,-1,0},
v={0,1,0};
if(addr==(void*)(-1))
{
perror("shmat error!\n");
return -1;
}
char *Addr=(char *)addr;
while(1)
{
semop(sem_id,&p,1);
printf("Ser:>%s\n",Addr);
printf("Cli:>");
scanf("%s",Addr);
semop(sem_id,&v,1);
}
shmdt(addr);
return 0;
}