进程间通信
(1)消息队列
int msgget(key_t key ,int msgfls)创建消息队列
参数1:key_t key;//暗号键值
参数2:创建消息队列权限(IPC_CREAT|| )
2,int msgsnd(int msgid,const void *msg_ptr,size_t msg_sz,int msgflg)
往消息队列发送消息
参数1:哪一个消息队列 msgid是由msgget函数返回的消息队列标识符。
参数2:msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。:
参数3:msg_sz是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。
参数4:msgflg用于控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情
3.int msgrcv(int msgid,void *msg_ptr, size_t msg_sz,long int msgtype, int msgflg);
接受消息队列里面信息
参数1:哪一个消息队列 msgid是由msgget函数返回的消息队列标识符。
参数2:msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。:
参数3:msg_sz是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。
参数4:msgtype可以实现一种简单的接收优先级。如果msgtype为0,就获取队列中的第一个消息。如果它的值大于零,将获取具有相同消息类型的第一个信息。如果它小于零,就获取类型等于或小于msgtype的绝对值的第一个消息。
参数5:msgflg用于控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情
调用成功时,该函数返回放到接收缓存区中的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区中,然后删除消息队列中的对应消息。失败时返回-1.
4,int msgctl(int mspid ,int command,strcut msqid_ds*buf) 控制函数
删除消息队列
函数的第一个参数msgqid 是消息队列对象的标识符。
第二个参数是函数要对消息队列进行的操作,它可以是:
IPC_STAT
取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构
中。
IPC_SET
设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds
结构给出。
IPC_RMID
将队列从系统内核中删除。
第三个参数:buf是指向msgid_ds结构的指针,它指向消息队列模式和访问权限的结构。
(2)共享内存
1.int shmget(key_t key, size_t size, int shmflg)创建共享内存
如果成功返回共享内存的id号
参数一key 会建立新共享内存对象 ,对方要有相同的key值才能够读取数据
参数 shmflg 是操作标志位,它的一些宏定义如下:
IPC_CREATE : 调用 shmget 时,系统将此值与其他共享内存区的 key 进行比较,如果存在相同的 key ,说明共享内存区已存在,此时返回该共享内存区的标识符,否则新建一个共享内存区并返回其标识符。
IPC_EXCL : 该宏必须和 IPC_CREATE 一起使用,否则没意义。当 shmflg 取 IPC_CREATE | IPC_EXCL 时,如果没有该块共享内存则创建,如果发现内存区已经存在则返回 -1,错误代码为 EEXIST 。
2. shmat 将共享内存与进程相连接,将这个内存映射到本进程的虚拟内存空间
void *shmat(int shmid, const void *shmaddr, int shmflg)
shmid 共享内存标识符 shmget成功创建或者打开后返回的值,就是shmid
shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
shmflg:SHM_RDONLY:为只读模式,其他为读写模式
返回值:
出错:-1,错误原因存于error中
成功:附加好的共享内存地址
3.shmdt 删除本进程的这块内存,解除映射
与shmat函数相反,是用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存
int shmdt(const void *shmaddr)
shmaddr:连接的共享内存的起始地址
返回值:
出错:-1,错误原因存于error中
成功:0
4.shmctl(共享内存管理)完成对共享内存的控制
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
参数1 :shmid 共享内存标识符 shmget成功创建或者打开后返回的值,就是shmid
参数2:cmd:
IPC_STAT:得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
IPC_SET:改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
IPC_RMID:删除这片共享内存
参数3:buf:共享内存管理结构体。具体说明参见共享内存内核结构定义部分
返回值:
成功:0
出错:-1,错误原因存于error中