sharemem.h
#ifndef _SHAREMEM_H_
#define _SHAREMEM_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <fcntl.h>
#include <iostream>
#include <pthread.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/stat.h>
#define SHMKEY (key_t) 0x100
#define SEMKEY (key_t) 0x200
#define IFLAGS (IPC_CREAT|IPC_EXCL)
#define ERR ((void*) -1)
#define MSG_HEADER_SIZE 8
int64_t g_count = 100;
//for shm
#define SHM_SIZE 50//1048576 //1024 * 1024
char* g_share_mem_ptr = NULL; //取得共享内存的指针
int g_shmid = -1;
bool g_have_shm;
//for mutex
#define WRITE_INDEX_POSITION 0
#define READ_INDEX_POSITION 8
#define DATA_INDEX_POSITION 16
#define SHM_DATA_SIZE 34//SHM_SIZE - DATA_INDEX_POSITION
#define POSITION_SIZE 8
int64_t g_write_offest;
int64_t g_read_offest;
//for sem
#define SEM_OP_MAX 2 //
#define SEM_OP_MIN 0
int g_semid = -1;
union semun
{
int val; //信号量初始值
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
//sops:指向存储信号操作结构的数组指针,信号操作结构的原型如下
//struct sembuf
//{
// unsigned short sem_num; /* semaphore number */
// short sem_op; /* semaphore operation */
// short sem_flg; /* operation flags */
//};
//sem_num:操作信号在信号集中的编号,第一个信号的编号是0。
//sem_op:
//如果其值为正数,该值会加到现有的信号内含值中。通常用于释放所控资源的使用权;
//如果为负数,而其绝对值又大于信号的现值,操作将会阻塞,
//直到信号值大于或等于sem_op的绝对值。
//通常用于获取资源的使用权;
//如果sem_op的值为0,如果没有设置IPC_NOWAIT,
//则调用该操作的进程或者线程将暂时睡眠,直到信号量的值为0;
//否则,进程或者线程不会睡眠,函数返回错误EAGAIN。
//sem_flg:信号操作标志,可能的选择有两种
//IPC_NOWAIT //对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息。
//SEM_UNDO //程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值。
//这样做的目的在于避免程序在异常情况下结束时未将锁定的资源解锁,造成该资源永远锁定。
struct sembuf
p0 = { 0, -1, 0}, //本组第1个信号量,阻塞加1,
p1 = { 1, -1, 0}, //本组第2个信号量,阻塞加1,
v0 = { 0, 1, 0}, //本组第1个信号量,放开加1,
v1 = { 1, 1, 0}; //本组第2个信号量,放开加1,
#pragma pack(push) //让原字节对齐方式入编译器栈
#pragma pack(1) //指定新的对齐方式, 1字节对齐. (数字即几字节对齐)
struct DataUnit {
int32_t type_;
int32_t size_;
char* data_ptr_;
int32_t AppendTo(const char* dist_str)
{
std::string data;
data.append(data_ptr_, size_);
std::cout << ty