这里记录的三种SystemV-IPC包括(消息队列,信号量以及共享内存)
1:标识符和键值
键值(key_t) : IPC结构的外部名(所谓外部名就是各用户进程可获得并操作的,通过它使用XXXget获得IPC结构的内部名"标识符").
键值是key_t数据类型,可以通过ftok函数获得,原型: key_t ftok(const chat *path, int id); ftok函数将一个已存在的路径名path和一个整数id(0~255)组合成一个key_t数据返回。
标识符 : IPC结构的内部名,是内核通过XXXget函数返回的,它标识了系统中唯一一个IPC结构,通过标识符来进行进程间的数据通信
有几种方法让不同进程通过操作同一个IPC来进行通信:
1:服务器进程使用IPC_PRIVATE键来替代用ftok来产生的键,通过XXXget获得返回的标识符,将标识符保存在一个文件中,此后要和服务器进程进行通信的进程通过打开此公知的文件获得标识符。
2:IPC_PRIVATE也可以用于父子进程中,父进程创建IPC结构获得标识符,子进程拿到标识符通过exec传递标识符到新程序,那么新程序就可以使用此标识符和父进程进行通信。
3:在公共文件中定义好path和id,让要互相通信的进程获得path和id通过ftok生成key来找到IPC来进行通信。
2:消息队列
打开一个已存在的队列或者创建一个新的队列:
原型 : int msget(key_t key, int flag);
参数 :
key : 由ftok返回的或者是宏IPC_PRIVATE,如果是IPC_PRIVATE就一定是创建一个新的IPC队列
flag :
时间: 2024-10-29 20:01:32