一、IPC对象。
1、 什么是IPC对象?
在linux下,IPC对象指的是消息队列、共享内存、信号量。如果用户需要使用IPC对象进行进程之间的通信,首先必须要为IPC对象申请对应资源(key值、ID号)。例如如果你想使用消息队列来通信,那么你就必须为消息队列申请key值与ID号。
2、查看当前系统中所有的IPC对象?
1)查看IPC对象: ipcs -a
------ Message Queues -------- //消息队列
key msqid owner perms used-bytes messages
消息队列key值 消息队列ID号 所有者 权限 总字节数 消息个数
------ Shared Memory Segments -------- //共享内存
key shmid owner perms bytes nattch status
共享内存key值 共享内存ID号 所有者 权限 总字节数 进程使用个数 状态
------ Semaphore Arrays -------- //信号量
key semid owner perms nsems
信号量key值 信号量的ID号 所有者 权限 信号量元素的个数
2)删除IPC对象。
想删除消息队列: ipcrm -q 消息队列key值 / ipcrm -q 消息队列ID号
想删除共享内存: ipcrm -m 共享内存key值 / ipcrm -m 共享内存ID号
想删除信号量: ipcrm -s 信号量key值 / ipcrm -s 信号量ID号
3、如果想使用IPC对象,那么如何申请key值? -> ftok() -> man 3 ftok
功能: ftok - convert a pathname and a project identifier to a System V IPC key
//给一个路径和一个数字就可以得到一个key值。
头文件:#include <sys/types.h>
#include <sys/ipc.h>
原型:
key_t ftok(const char *pathname, int proj_id);
参数:
pathname:一个存在并且合法的路径 "."
proj_id:非0整数 10
返回值:(key_t)
成功:key值
失败:-1
分析:
The resulting value is the same for all pathnames that name the same file, when the same value of proj_id is used.
//当两个ftok()函数的参数文件路径与project_id都一样时,两个函数的返回值是一样。
The value returned should be different when the (simultaneously existing) files or the project IDs differ.
//只要文件路径/proj_id有一个不一样,那么返回值就不一样。
4、 测试示例:
#include <sys/types.h>
#include <sys/ipc.h>