代码学习笔记

来源:互联网 发布:最好的pdf阅读器 知乎 编辑:程序博客网 时间:2024/05/01 22:04

msgget

功能描述:  获取与某个键关联的消息队列标识。消息队列被建立的情况有两种:

  1.如果键的值是IPC_PRIVATE。

  2.或者键的值不是IPC_PRIVATE,并且键所对应的消息队列不存在,同时标志中指定IPC_CREAT。

  如果新的消息队列被建立,它关联的msqid_ds数据结构初始化如下:

  msg_perm.cuid 和 msg_perm.uid设为调用者的有效用户标志;

  msg_perm.cgid 和 msg_perm.gid设为调用者的有效用户组标志;

  msg_perm.mode最低9个位设为msgflg的最低9个位;

  msg_qnum,msg_lspid,msg_lrpid,msg_stime和msg_rtime设为0;

  msg_ctime设为当前时间;

  msg_qbytes设为系统限制MSGMNB。

 

 

  #include <sys/ipc.h>

  #include <sys/msg.h>

  int msgget(key_t key, int msgflg);

  参数:

  key:消息队列关联的键。

  msgflg:消息队列的建立标志和存取权限。

  返回说明:

  成功执行时,返回消息队列标识值。失败返回-1,errno被设为以下的某个值 ,有时也会返回0,这个时候也是可以正常使用的

  EACCES:指定的消息队列已存在,但调用进程没有权限访问它,而且不拥有CAP_IPC_OWNER权能

  EEXIST:key指定的消息队列已存在,而msgflg中同时指定IPC_CREAT和IPC_EXCL标志

  ENOENT:key指定的消息队列不存在同时msgflg中不指定IPC_CREAT标志

  ENOMEM:需要建立消息队列,但内存不足

  ENOSPC:需要建立消息队列,但已达到系统的限制

 

msgsnd

功能:发送消息到指定的消息队列中.
语法:#include
#include
#include
int msgsnd(msqid,msgp,msgsz,msgflg)
int msqid;
void *msgp;
size_t msgsz;
int msgflg;
说明:发送一个消息到由msqid指定消息队列标识号的消息队列.
参数msgp指向一个用户定义的缓冲区,并且缓冲区的第一个域应
为长整型,指定消息类型,其他数据放在缓冲区的消息中其他正文
区内.下面是消息元素定义:
long mtype;
char mtext[];
mtype是一个整数,用于接收进程选择消息类型.
mtext是一个长度为msgsz字节的任何正文,参数msgsz可从0到系
统允许的最大值间变化.
msgflg指定操作行为:
. 若(msgflg&IPC_NOWAIT)是真的,消息并不是被立即发送而调用
进程会立即返回.
. 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下
面情况之一发生:
* 消息被发送出去.
* 消息队列标志被系统删除.系统调用返回-1.
* 调用进程接收到一个未被忽略的中断信号,调用进程继续
执行或被终止.
调用成功后,对应指定的消息队列的相关结构做如下动作:
. 消息数(msg_qnum)加1.
. 消息队列最近发送进程号(msg_lspid)改为调用进程号.
. 消息队列发送时间(msg_stime)改为当前系统时间.
以上信息可用命令ipcs -a看到.
返回值:成功则返回0,否则返回-1.