最初的UNIX系统存在信号、管道和命名管道等基本的进程间通讯机制,System V出现后引入了三种高级进程间通讯机制:消息队列、共享内存和信号量。
新引入的三个通讯机制是以对象的形式存在的,被称为IPC对象,它们存在于内核而不是文件系统中,由用户控制释放(由用户管理IPC对象的生命周期,用户不释放IPC对象,它们就会永远存在于内核之中,除非重启计算机),不像管道一样由内核控制释放。
IPC对象通过其标识符来引用和访问,所有IPC对象在内核空间中有唯一性标识ID,在用户空间的唯一标识称为key。
IPC对象是全局对象,可以用ipcs命令进行查看,用ipcrm命令进行删除。
每个IPC对象都有后缀为get的函数进行创建,msgget,shmget,semget,分别为创建消息队列对象、共享内存对象、信号量对象,调用这些get函数时必须指定关键字key,这个key就是用户空间指定的键值,创建完成后在内核空间会被分配一个唯一的ID。
下面我们说一个结构体,这个结构体被称为IPC对象的权限和拥有者结构体,上面三个IPC对象都会用到这个结构体
struct ipc_perm
{
uid_t uid; /*IPC对象拥有者的用户ID*/
gid_t gid; /*IPC对象拥有者的所在用户组ID*/
uid_t cuid; /*IPC创建者的用户ID*/
gid_t cgid; /*IPC创建这的所在用户组ID*/
mode_t mode; /*访问权限*/
}
新引入的三个通讯机制是以对象的形式存在的,被称为IPC对象,它们存在于内核而不是文件系统中,由用户控制释放(由用户管理IPC对象的生命周期,用户不释放IPC对象,它们就会永远存在于内核之中,除非重启计算机),不像管道一样由内核控制释放。
IPC对象通过其标识符来引用和访问,所有IPC对象在内核空间中有唯一性标识ID,在用户空间的唯一标识称为key。
IPC对象是全局对象,可以用ipcs命令进行查看,用ipcrm命令进行删除。
每个IPC对象都有后缀为get的函数进行创建,msgget,shmget,semget,分别为创建消息队列对象、共享内存对象、信号量对象,调用这些get函数时必须指定关键字key,这个key就是用户空间指定的键值,创建完成后在内核空间会被分配一个唯一的ID。
下面我们说一个结构体,这个结构体被称为IPC对象的权限和拥有者结构体,上面三个IPC对象都会用到这个结构体
struct ipc_perm
{
uid_t uid; /*IPC对象拥有者的用户ID*/
gid_t gid; /*IPC对象拥有者的所在用户组ID*/
uid_t cuid; /*IPC创建者的用户ID*/
gid_t cgid; /*IPC创建这的所在用户组ID*/
mode_t mode; /*访问权限*/
}