IPC对象包括:是活动在内核级别的一种进程间通信的工具,是一种机制。目前Linux也支持这三种机制:共享内存、消息队列、信号灯集。
1、IPC
struct ipc_perm
{
key_t key; 关键字
uid_t uid; /*共享内存所有者的有效用户ID */
gid_t gid; /* 共享内存所有者所属组的有效组ID*/
uid_t cuid; /* 共享内存创建 者的有效用户ID*/
gid_t cgid; /* 共享内存创建者所属组的有效组ID*/
unsigned short mode; /* Permissions + SHM_DEST和SHM_LOCKED标志*/
unsignedshort seq; /* 序列号*/
};
key比较关键,是识别这个共享通道的钥匙。
在这三种机制中都会用到这个创建的key;
一般用 ftok这个函数来创建钥匙。
key_t ftok( char * fname, int id )
例如:
if ((key = ftok(".", 's')) < 0)
{
perror("fail to ftok");
exit(-1);
}
这样就产生了一个key,其实也可以自己定义key,但是这样定义的key不安全。所以尽量用ftok来产生key。
2、共享内存:
它是一种最为高效的进程间通信方式,进程可以直接读写内存,不需要任何数据的拷贝为了在多个进程间交换信息,
内核专门留出了一块内存区,可以有需要访问的进程将其映射到自己的私有地址空间,所以内核就不需要数据拷贝的操作,
这样子一来就提高了进程的效率(内核来处理问题比进程来的快)。
而实现共享内存有2个步骤:1、在内核中创建出一块共享内存。(shmget())
2、将共享内存映射到进程的映射区。(shmat())
3、撤销映射的操作。(shmdt())
3、消息队列:
顾名思义,消息队列就是一些消息的列表,使用者可以在队列中添加和读取消息等操作。
在某些方面(主要是读取操作)与FIFO的一些特性很相像,甚至可以说就是一样的。但是比FIFO更有优势,因为它可以实现消息的随机查询。
这些消息存在内核中,都有一个“队列ID”来标识。
实现消息队列有4步骤:1、创建或打开队列(msgget()),创建队列的数量受到系统消息队列的限制。
2、添加消息(msgsnd()),把消息添加到已打开的消息队列的末尾。
3、读取消息(msgrcv()),根据“队列ID”取走消息队列中指定的消息。
4、控制消息队列(msgctl()),消息队列的移除撤销。