进程通信之共享内存
-
共享内存即允许两个不相关的进程访问同一个逻辑内存,一个简单的进程之间的通信用以下函数即可:
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