进程通信之共享内存



  • 共享内存即允许两个不相关的进程访问同一个逻辑内存,一个简单的进程之间的通信用以下函数即可:
    1.创建共享内存
    int shmget(key_t key, size_t size, int shmflg);
    key:为共享内存段命名
    size:以字节为单位指定需要共享的内存容量
    shmflg:权限标志,与与IPC_CREAT做或操作可指定权限
    2.启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间
    void *shmat(int shm_id, const void *shm_addr, int shmflg);
    shm_id:shm_addr返回的共享内存标识
    shm_addr:指定共享内存连接到当前进程中的地址位置
    shm_flag:标志位,通常为零
    3.将共享内存从当前进程中分离
    int shmdt(const void *shmaddr);
    shmaddr:shmat返回的地址指针
    4.控制共享内存
    int shmctl(int shm_id, int command, struct shmid_ds *buf);
    shm_id:shmget返回的共享内存标识符、
    command:要采取的操作
    buf:指向共享内存模式和访问权限的结构


  • 核心层

    哇塞,我也是用的共享内存,啥时候讨论一波



  • @mengyingyu 哇我也用的是共享内存。如果能给出一个具体的例子就更好了



  • 使用共享内存需要注意的一点是,互斥锁的使用;不然不同进程之间读写可能会发送冲突,出现玄学bug。



  • @qgrain 你看看这个

    	
    int main( )
    {
        
    	//在主函数最开始处初始化共享内存
    	int shmid = shmget((key_t)10086,sizeof(SHM),IPC_CREAT|0666);
    	p_shm = shmat(shmid,NULL,0);
    	if (p_shm == (void *)-1)
    	{
    		printf("create shared memory failed!\n");
    		exit(1);
    	}
    
        //设置互斥锁属性
    	pthread_mutexattr_t mattr;
    	pthread_mutexattr_init(&mattr);
    	pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
    	pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);
    	
        //初始化互斥锁
       	pthread_mutex_t * p_lock = &(((SHM *)p_shm)->mutex);
    	pthread_mutex_init(p_lock,&mattr);
    
    	/*
    	多进程代码
    	*/
        
    	//销毁共享内存
    	shmdt(p_shm); 
    	shmctl(shmid,IPC_RMID,NULL);
        
    	return 0;
    }
    
    
    //子进程调用的函数或者子进程代码 例如
    void child_process()
    {
        //打开共享内存,注意shmget的第二个参数为0,表示打开而不是创建内存
        int shmid = shmget((key_t)10086,0,IPC_CREAT|0666);
    	p_shm = shmat(shmid,NULL,0);
    	if (p_shm == (void *)-1)
    	{
    		printf("open shared memory failed!\n");
    		exit(1);
    	}
        
    	/*
    	code
    	*/
        //当需要读写共享内存时需要用到互斥锁
        //关闭互斥锁
    	pthread_mutex_t * p_lock = &(((SHM *)p_shm)->mutex);
    	/*
    	共享内存读写
    	*/
    	//打开互斥锁
    	pthread_mutex_unlock(p_lock);
        /*
        code
        */
        return;
    }
    


  • @luck Golang了解一下,channel通信,无锁队列。告别mutex lock


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待