在做项目的过程中发现一种简便的多进程通信的方法,现将它记录下来。该项目采用多进程的方式向多个客户端同时发视频数据。
1、创建共享内存结构体
struct shm_mutex {
int pic_size;
char pic_buf[PIC_COUNT];
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
};
struct shm_mutex *pic_mutex;
2、申请共享内存空间
int fd = open("test",O_CREAT|O_RDWR,0777);
ftruncate(fd,sizeof(*pic_mutex)); //改变文件大小
pic_mutex = mmap(NULL,sizeof(struct shm_mutex),
PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); //用户地址映射到内核空间
close(fd);
memset(pic_mutex,0,sizeof(*pic_mutex));
3、设置共享内存进程间属性
pthread_mutexattr_init(&pic_mutex->mutexattr);
pthread_mutexattr_setpshared(&pic_mutex->mutexattr,PTHREAD_PROCESS_SHARED);//此句将线程锁改变为进程间共用属性
pthread_mutex_init(&pic_mutex->mutex,&pic_mutex->mutexattr);
在此线程锁的进程间共用属性设置完毕,即可对其进行上锁解锁操作。
4、操作共享内存
pthread_mutex_lock(&pic_mutex->mutex); //上锁
bzero(pic_mutex->pic_buf, PIC_COUNT);
pic_mutex->pic_size = get_picture(pic_mutex->pic_buf); //获取图片
pthread_mutex_unlock(&pic_mutex->mutex); //解锁
pthread_mutex_lock(&pic_mutex->mutex);
ret_send = sendto(udp_connfd, pic_mutex->pic_buf, pic_mutex->pic_size, 0,
(struct sockaddr *)&client_addr, len); //发送图片 至客户端
pthread_mutex_unlock(&pic_mutex->mutex);