共享内存和信号量函数的封装

代码功能实现请链接:https://blog.csdn.net/qq_41985711/article/details/82426058

一、头文件:myhead.h

#ifndef _MYHEAD_H_
#define _MYHEAD_H_
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <strings.h>
#include <sys/wait.h>
#include <errno.h>

#include <sys/sem.h>
#include <sys/shm.h>
#include <sys/ipc.h>

#include "semshm.h"


#endif

二、头文件:semshm.h

#ifndef __SEMSHM_H
#define __SEMSHM_H

#include "myhead.h"


//生成唯一 key 值时所用参数 
#define SEMPATH "."
#define SEMNUM 1 
#define SHMPATH "."
#define SHMNUM 2
#define BUFSIZE 1024
#define SETSEMNUM 2

int getsem(void);
int getshm(void);
struct sembuf *setpv(int sem_num, int sem_op);
#endif 

三、生成共享内存和信号量的函数封装 semshm.c

#include "semshm.h"
#include "myhead.h" 

int getsem(void)
{
	key_t key = ftok(SEMPATH, SEMNUM);
	int semid = semget(key, SETSEMNUM, IPC_CREAT | 0777);
	if (semid == -1)
	{
		if (errno != EEXIST)
		{
			perror("setget() filed");
			exit(0);
		}
	} 
	return semid;
}

int getshm(void)
{
	key_t key = ftok(SHMPATH, SHMNUM);
	int shmid = shmget(key, BUFSIZE, IPC_CREAT | 0777);
	if (shmid == -1)
	{
		if (errno != EEXIST)
		{
			perror("shmget() filed");
			exit(0);
		}
	}  
	return shmid;
}

//设置 PV 操作函数
struct sembuf *setpv(int sem_num, int sem_op)
{
	struct sembuf *mysembuf = calloc(1, sizeof (struct sembuf));
	mysembuf->sem_num = sem_num;
	mysembuf->sem_op = sem_op;
	mysembuf->sem_flg=SEM_UNDO;
	
	return mysembuf;
} 

四、发送端   sent.c

#include "myhead.h"
#include "semshm.h"

int semid;
int shmid;
char *p;

void func(int sig)
{
	shmdt(p);
	shmctl(shmid, IPC_RMID, NULL);
	semctl(semid, 0, IPC_RMID);
	exit(0);
}

int main(void)
{ 
	signal(SIGINT, func);
	struct sembuf *mysembuf1 = setpv(0, -1);
	struct sembuf *mysembuf2 = setpv(1, 1);
	
	int semid = getsem();
	int shmid = getshm();


	char *p= shmat(shmid, NULL, 0);
	semctl(semid, 0, SETVAL, 1);
	semctl(semid, 1, SETVAL, 0);
	while(1)
	{ 
		semop(semid, mysembuf1, 1);
		printf("scanf sent msg : ");
		fflush(stdout);
		scanf("%s",p);
		semop(semid, mysembuf2, 1);
	}
	return 0;
}

五、接收端  save.c

#include "semshm.h"

int main(void)
{ 

	struct sembuf *mysembuf1 = setpv(1, 1);
	struct sembuf *mysembuf2 = setpv(0, -1);
	
	int semid = getsem();
	int shmid = getshm();
	
	char *p = shmat(shmid, NULL, 0);
	
	while(1)
	{
		semop(semid, mysembuf2, 1);
		printf("first stop filed!!!\n");
		printf("save msg : %s\n", p);
		semop(semid, mysembuf1, 1);	
	}
	return 0;
	
}

猜你喜欢

转载自blog.csdn.net/qq_41985711/article/details/82454470