linux C 利用共享内存和信号量实现服务器和客户端的交互

//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;
}

猜你喜欢

转载自blog.csdn.net/Henry313/article/details/88926804