key_t ftok(const char *pathname, int proj_id);
功能:生成一个key(目的在于创建IPC对象的时候不会冲突)
返回值:成功返回key值,失败为-1
pathname:一个文件可以包含路径
proj_id:一个随便的值
key值的生成需要某一个文件的inode节点号和proj_id进行组合运算
IPC
对象
ftok
:生成一个
key
(用于创建
IPC
对象)
1.
共享内存(
shm
)
多个进程都可以访问同一个内存空间,而每个进程都是独立的空间,那么共享内存只能是在内核中。内
核会映射这个空间到用户空间来,用户进程访问映射后的空间等于是访问内核空间。
“
最高效的进程间通信方式
”
,需要同步互斥的机制
.
打开
/
创建共享内存对象:
int shmget(key_t key, size_t size, int shmflg);功能:打开一个共享内存对象返回值:成功返回共享内存 id 号,失败返回 -1key :一般使用 ftok 的值,如果要编程私有对象(使用 IPC_PRIVATE -- 0 )size :要创建的共享内存空间大小shmflg :打开对象的方式 -- IPC_CREAT IPC_EXCL
映射空间:
int shmdt(const void *shmaddr);功能:取消共享内存的映射空间返回值:成功返回 0 ,失败返回 -1shmaddr :映射空间的地址
删除对象:
int shmctl(int shmid, int cmd, struct shmid_ds *buf);功能:共享内存对象的一些控制操作返回值:成功返回 0 ,失败返回 -1shmid :要操作的共享内存 id 号cmd :要操作的方式 (获取属性、设置属性、删除对象)IPC_RMID -- 删除buf :设置或者查看属性的时候才有用,删除对象时使用 NULL
2.消息队列(msg)
按照类型来选择是否接收消息,也是在内核中有一片空间用于交换消息,但是不需要映射
创建
/
打开消息队列:
int msgget(key_t key, int msgflg);功能:打开或者创建一个消息队列对象返回值:成功消息队列 id 号,失败返回 -1key : ftok 生成的 key ,或者 IPC_PRIVATEmsgflg :打开或者创建的方式, IPC_CREAT IPC_EXCL 还有权限 0666
发送消息:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);功能:往消息队列中添加某个类型的消息返回值:成功返回 0 ,失败返回 -1msqid :消息队列 ID 号msgp :消息结构体struct msgbuf {long mtype; /* message type, must be > 0 */char mtext [ 1 ] ; /* message data */} ;msgsz :结构体大小msgflg : IPC_NOWAIT 表示不等函数执行完成就返回, 0 表示函数执行完才返回
接收消息:
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);功能:从消息队列中提取自己关心的某个消息返回值:成功返回实际收到的字节数,失败返回 -1msqid :消息队列 ID 号msgp :消息结构体,存放消息msgsz :要收多少字节的数据msgtype :关心的消息类型msgflg : IPC_NOWAIT 阻塞, 0 不阻塞
3.信号灯集(sem)
信号量的集合
信号灯集创建
/
打开
int semget(key_t key, int nsems, int semflg);功能:打开或者创建一个信号灯集合对象返回值:成功返回信号灯集合 ID ,失败返回 -1key : ftok ? IPC_PRIVATEnsems :创建的信号灯集中有几种信号量semflg :打开方式 IPC_CREAT 0666
信号灯集控制
int semctl(int semid, int semnum, int cmd, ...);
功能:对信号灯集进行一些控制操作(比如设置内容,删除对象)
返回值:成功返回
0
,失败返回
-1
semid
:信号灯集的
id
号
semnum
:要修改的信号灯的编号(从
0
开始)
cmd
:控制指令
SETVAL --
设置信号灯的值
GETVAL --
获取信号灯的值
IPC_RMID --
删除对象
信号灯的
PV
操作
int semop(int semid, struct sembuf *sops, size_t nsops);功能:实现信号灯的申请或者释放等操作返回值:成功返回 0 ,失败返回 -1semid :信号灯集的 id 号sops :struct sembuf {unsigned short sem_num; // 要操作的信号灯编号short sem_op; // 要操作的动作: 1 表示释放资源, -1 表示申请资源short sem_flg; //0 表示阻塞, IPC_NOWAIT}nsops :要操作的信号灯个数