一、头文件: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;
}