System V共享内存
- 共享内存是进程间的一种通信方式,多个进程共同使用同一块“共享空间”,共享空间存在于内核,随内核的持续性。
- 共享内存的使用方法和步骤:
1.申请一个“key,许可证”
//生成一个IPC的key
key_t key = ftok(PATHNAME ,PRO_ID);
if(key == -1)
{
perror("ftok failed");
exit(-1);
}
使用ftok函数来向操作系统申请一个key
2.创建或打开一个System V共享内存的对象,其实就是获取对象的id号
//利用key创建或者打开IPC对象(共享内存对象)
int shm_id = shmget(key,1024,IPC_CREAT | 0664);
if(-1 == shm_id)
{
perror("shmget failed");
exit(-1);
}
3.映射/解映射到用户的进程空间
//映射到自己的进程地址空间
char *p = (char *)shmat(shm_id, NULL, 0);
if(p == NULL)
{
perror("shmat failed");
exit(-1);
}
*4.其他的操作
使用shmctl函数可以删除一个IPC对象,设置和获取属性,详情可以man一下。
System V 信号量
- 信号量是为了保护共享资源而存在的,是一种进程间的通信方式,这种方式不是用来传递数据的,是一种提供给不同进程或者同一个进程中不同线程之间的同步(避免竞争资源)的一种机制。
信号量的使用步骤(方法):
1.申请一个“key,许可证”
//申请一个System V信号量的“key”
key_t key = ftok(PATHNAME,PRO_ID);
if(key == -1)
{
perror("ftok failed");
exit(-1);
}
2.创建或者打开一个System V的信号量(返回值为一个id号)
//2.创建或者打开一个systemV的信号量
int sem_id = semget(key_sem,1,IPC_CREAT | 0664);
if(sem_id == -1)
{
perror("semget failed");
exit(-1);
}
3.其他的操作:利用sem_ctl函数来设置,获取计数信号量集中的某一个或者某一些信号量的值,信号量的值表示可以被多少个进程同时访问。
信号量是为保护共享资源有序访问而创建的,所以我们怎么样才能保护共享内存当中的数据呢?
当某一个进程要访问共享内存当中数据时,会进行P操作将共享内存的数据进行一个“上锁”,当数据访问结束后,会进行V操作将共享内存的数据进行一个“解锁”。上锁表示,该共享数据暂时不能够被访问,只有当解锁后,该共享区域才能够被重新访问。
所以接下介绍一下P操作和V操作!!!
P操作(上锁):
//进行P操作
//将存储信号集的结构体定义号后
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = -1;
sops.sem_flg = 0 | SEM_UNDO ;
P操作是定义一个结构体变量,将变量的值初始化。当sops.sem_op小于零时表示进行P操作
V操作(解锁):
//进行V操作
//将存储信号集的结构体定义号后
struct sembuf sops;
sops.sem_num = 0;
sops.sem_op = 1;
sops.sem_flg = 0 | SEM_UNDO ;
V操作是定义一个结构体变量,将变量的值初始化。当sops.sem_op大于零时表示进行V操作
每日一句:人生始终充满战斗激情