LInux实现 System V 信号量进程通信(共享内存)
一、利用System V实现进程通信所需要的库
#ifndef _COMMON_H_
#define _COMMON_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
static const char * MUTEX_NAME = "mutex_shm";
static const char * FULL_NAME = "full_shm";
#define SHM_SIZE 1024
#define KEY_NUM 1000
int GetShmId(key_t key);
void SemInit();
void SemDestroy();
void P(sem_t *sem);
void V(sem_t *sem);
#endif
- id 与 key 是不一样的,id是由系统随机生成的,用户对于 id 没有任何操作的权限,但是密匙 key 就可以由函数调用,对共享内存的位置等代表性地方进行标注。
二、基本自定义函数
#include "common.h"
int GetShmId(key_t key)
{
int shmid;
shmid = shmget(key,SHM_SIZE,IPC_CREAT|0666);
if(shmid < 0)
{
perror("Receiver: Shmget Error");
exit(EXIT_FAILURE);
}
return shmid;
}
void SemInit()
{
if((sem_open(MUTEX_NAME,O_CREAT,0644,1)) < 0)
{
perror("sem_open");
exit(EXIT_FAILURE);
}
if((sem_open(FULL_NAME,O_CREAT,0644,0)) < 0){
perror("sem_open");
exit(EXIT_FAILURE);
}
}
void SemDestroy()
{
sem_t * mutexPtr = sem_open(MUTEX_NAME,O_CREAT);
sem_t * fullPtr= sem_open(FULL_NAME,O_CREAT);
sem_close(mutexPtr);
sem_unlink(MUTEX_NAME);
sem_close(fullPtr);
sem_unlink(FULL_NAME);
}
void P(sem_t *semPtr)
{
sem_wait(semPtr);
}
void V(sem_t *semPtr)
{
sem_post(semPtr);
}
三、共享内存初始化函数
#include "common.h"
int main(int argc, char const *argv[])
{
key_t key;
int semid;
int shmid;
key = KEY_NUM;
SemInit();
GetShmId(key);
printf("End of initialize\n");
return 0;
}
四、进程信息发送函数
#include "common.h"
#include <stdio.h>
key_t key;
int shmid;
char * shmptr;
char input[SHM_SIZE];
sem_t * full;
sem_t * mutex;
void Init()
{
key = KEY_NUM;
shmid = GetShmId(key);
shmptr = shmat(shmid,NULL,0);
full = sem_open(FULL_NAME,O_CREAT);
mutex = sem_open(MUTEX_NAME,O_CREAT);
}
void SaveMessage()
{
P(mutex);
strcpy(shmptr,input);
V(mutex);
V(full);
}
int main(int argc, char const *argv[])
{
Init();
fgets(input, 1024, stdin);
SaveMessage();
printf("Sender: Process End\n");
return 0;
}
五、进程信息接收函数
#include "common.h"
key_t key;
int shmid;
char * shmptr;
char result[SHM_SIZE];
sem_t * full;
sem_t * mutex;
void Init()
{
key = KEY_NUM;
shmid = GetShmId(key);
shmptr = shmat(shmid,NULL,0);
full = sem_open(FULL_NAME,O_CREAT);
mutex = sem_open(MUTEX_NAME,O_CREAT);
}
void ReadMessage()
{
P(full);
P(mutex);
strcpy(result,shmptr);
V(mutex);
}
int main(int argc, char const *argv[])
{
Init();
ReadMessage();
printf("Receiver : message is %s\n",result);
SemDestroy();
printf("Receiver : Process End \n");
return 0;
}