尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

互斥锁+共享内存封装库,实现大数据进程间通讯(Linux)

互斥锁+共享内存封装库,实现大数据进程间通讯(Linux) Linux下提供了多种共享内存的通讯机制常用的就是socket但是socket通讯使用简单但性能不佳大数据传输最优的方式还是共享内存方式。本章分享封装库就是基于共享内存实现的。封装库连接(66条消息) 互斥锁共享内存封装库实现进程间通讯(Linux)-C文档类资源-CSDN文库本章分享库是基于Ubuntu16.04编译的如需其它平台编译库可以发邮件至512146329qq.com共享内存Linux提供了三种方式POSIX共享内存对象POSIX内存映射文件SYSTEM V共享内存这三种方式的区别就不分析了大家可以网上检索一下。本章分享的基于第二种方式“POSIX内存映射文件”实现的。设计的要求1使用进程间的互斥锁实现了共享内存共享数据的互斥访问问题2有效数据部分通过分配器来管理内存的开辟和释放3实现了一对多的订阅/发布模型一端发送多端接收的模型设计的架构图接口定义#ifndef __DEVIN_SHM_FIFO_H__ #define __DEVIN_SHM_FIFO_H__ void *devin_shm_fifo_init(char *topic); void devin_shm_fifo_destory(void *handle); int devin_shm_fifo_read(void *handle, void *buf, int max_buf_len, int *datalen); // 写入端有一次拷贝 (将数据拷贝到共享内存区域) int devin_shm_fifo_write(void *handle, const void *data, int datalen); // 零拷贝的操作 (仅用于发送或写入端) // 从共享内存中获的可用的空间返回地址 int devin_shm_fifo_get_addr(void *handle, void **addr, void **addr_param, int datalen); // 数据写入共享内存后及时同步到接收端 int devin_shm_fifo_write_sync(void *handle, void *addr, void *addr_param, int datalen); #endif接口使用示例// 订阅方 #include stdio.h #include unistd.h #include string.h #include sys/time.h #include devin_shm_fifo.h int main() { char *topic topic; void *shmfifo NULL; char buffer[1024*1024*3] {0}; int i 0; int ret -1; struct timeval cur_time; int datalen 0; shmfifo devin_shm_fifo_init(topic); if(!shmfifo) { printf(devin_shm_fifo_init fail\n); return -1; } int mm 0; while (1) { memset(buffer, 0, sizeof(buffer)); ret devin_shm_fifo_read(shmfifo, buffer, sizeof(buffer), datalen); if(ret 0) { gettimeofday(cur_time,NULL); printf(%05d, %s, %ld\n, mm, buffer, cur_time.tv_sec * 1000000 cur_time.tv_usec); }else{ //printf(xxxxxxx : %d\n, ret); } usleep(5*1000); } devin_shm_fifo_destory(shmfifo); return 0; }// 发布方 #include stdio.h #include unistd.h #include string.h #include sys/time.h #include devin_shm_fifo.h int main() { char *topic topic; void *shmfifo NULL; char buffer[1024*1024*3] {0}; int i 0; int ret -1; void *addr NULL; void *addr_param NULL; struct timeval cur_time; shmfifo devin_shm_fifo_init(topic); if(!shmfifo) { printf(shmfifo_init fail\n); return -1; } while (1) { memset(buffer, 0, sizeof(buffer)); gettimeofday(cur_time,NULL); snprintf(buffer, sizeof(buffer), aaaaa%05d, time: %ld, i, cur_time.tv_sec * 1000000 cur_time.tv_usec); send: // 获取指定大小的空间地址 ret devin_shm_fifo_get_addr(shmfifo, addr, addr_param, sizeof(buffer)); if(ret 0) { printf(devin_shm_fifo_get_addr ret %d\n, ret); goto send; } // 给空间填充数据 memcpy(addr, buffer, sizeof(buffer)); // 数据同步到接收端 ret devin_shm_fifo_write_sync(shmfifo, addr, addr_param, sizeof(buffer)); if(ret 0) { printf(devin_shm_fifo_write_sync ret %d\n, ret); }else{ printf(%s\n, buffer); } usleep(10*1000); } //void shmfifo_get(shmfifo_t *fifo, void *buf); devin_shm_fifo_destory(shmfifo); return 0; }
返回列表