将分享技术博文作为一种快乐,提升自己帮助他人
分类: LINUX
2023-03-28 23:23:53
点击(此处)折叠或打开
pathname: 制定的文件,此文件必须存在且可访问
proj_id: 计划代号,尽管是int型,但只有低8bit才会用于生成IPC key键值(因此低8bit不可为0)。
成功:返回key_t类型的键值,失败返回-1,错误原因存于error中。
ps: key_t一般为32位的int型类型数据。
点击(此处)折叠或打开
点击(此处)折叠或打开
从上面程序可以看出,通过ftok返回的是根据文件(pathname)信息和工程编号(proj_id)合成的IPC key键值,从而避免用户使用key值的冲突。proj_id值的意义让一个文件也能生成多个IPC key键值。ftok利用同一文件可得到256个IPC key键值,因为ftok只取proj_id值二进制的后8位,即16进制的后两位与文件信息合成IPC key键值。
对于key值,应用程序有如下三种选择:
(1) 调用ftok函数,给它传递pathname和proj_id,操作系统根据两者合成key值。
(3) 指定key为大于0的常数,这需要用户自行保证生成的IPC key值不与系统中的存在冲突,而前两种操作系统会保证。
(2) 指定key为IPC_PRIVATE,内核保证创建一个新的、唯一的IPC对象、IPC标识符与内存中的标识符不会冲突。IPC_PRIVATE为宏定义,其值等于0。
system V IPC中的消息队列、信号量和共享内存的IPC函数如下。
接口类型 | 消息队列 | 信号量 | 共享内存 |
创建或打开IPC函数 | msgget | semget | shmget |
控制IPC操作函数 | msgctl |
semctl |
shmctl |
IPC操作函数 |
msgsnd
msgrcv
|
semop |
shmat
shmdt
|
IPC标识符不同与IPC key值,如前面所述,IPC标识符是消息队列、信号量和共享内存通过创建或打开IPC函数msgget(), semget()或者shmget()函数通过key值得到的。
点击(此处)折叠或打开
flag创建模式标志 | IPC对象不存在 | IPC对象已存在 |
无特殊标志 | 出错,errno=ENOENT | 成功,引用已存在对象 |
IPC_CREAT | 成功,创建新对象 |
成功,引用已存在对象 |
IPC_CREAT | IPC_EXCL |
成功,创建新对象 |
出错,errno=EEXIT |