linux不同进程使用共享内存及互斥锁
1 共享内存
头文件:
- #include <sys/shm.h>
- #include <sys/ipc.h>
1.1 key值
指定一个文件地址,让不同进程可以通过ftok产生同一个key值:
std::string path = ("/home/test.txt");
FILE *fd = fopen(path.c_str(),"a");
fclose(fd);
int key = ftok(path.c_str(), 0);
1.2 创建/获取,映射
shmget通过key创建/获取共享内存id;shmat将共享内存映射到本进程空间;
同个进程最好只shmat一次。
int shm_size = 5000;
int shm_id = shmget(key, shm_size, IPC_CREAT | 0666);
char *shmaddr = (char*)(shmat(shm_id, NULL, 0));
1.3 断开,删除
在进程结束时,需要断开共享内存的映射,或者删除共享内存。
shmdt(shmaddr);
shmctl(shm_id, IPC_RMID, NULL);
如果强制退出了进程,共享内存只断开连接,不会自己删除共享内存。
可以在命令行输入以下命令:
ipcs -m
ipcrm -m [shm_id]
1.4 查看状态
shmctl还可以查看共享内存状态,获取struct shmid_ds结构体内容:
- shm_cpid:表示该共享内存创建者进程的pid
- shm_nattch :表示当前该共享内存的连接进程数量
struct shmid_ds shm_status;
shmctl(sm->shm_id, IPC_STAT, &shm_status);
cout<< "shm_status->shm_cpid=" << shm_status.shm_cpid << endl;
cout<< "getpid()=" << getpid() << endl;
cout<< "shm_nattch=" << shm_status.shm_nattch << endl;
因此,想要解决强制退出的内存泄漏问题,可以用这些状态信息来解决:
struct shmid_ds old_shm_status;
int err = shmctl(sm->shm_id, IPC_STAT, &old_shm_status);
if(err == 0 && old_shm_status.shm_nattch == 0){
shmctl(sm->shm_id, IPC_RMID, NULL);
}
获取key;
创建shm;
映射地址;
struct shmid_ds shm_status;
shmctl(sm->shm_id, IPC_STAT, &shm_status);
if(shm_status.shm_cpid == getpid()){
初始化;
}
2 互斥锁
想要在不同进程使用同一个互斥锁,可以把该锁保存在共享内存中,并且需要设置参数初始化:
pthread_mutex_t mutex;
pthread_mutexattr_t mutex_attr;
memset(&mutex_attr, 0, sizeof(pthread_mutexattr_t));
pthread_mutexattr_init(&mutex_attr);
pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(&mutex, &mutex_attr);
|