多进程之间共享内存通信之pthread_mutex_t

    在做项目的过程中发现一种简便的多进程通信的方法,现将它记录下来。该项目采用多进程的方式向多个客户端同时发视频数据。

    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);


你可能感兴趣的:(多进程之间共享内存通信之pthread_mutex_t)