-
Notifications
You must be signed in to change notification settings - Fork 54
msgsnd msgrcv
果冻虾仁 edited this page Aug 22, 2017
·
2 revisions
这是一对函数,用于消息队列的发送和接收
msgsnd函数用于将新的消息添加到消息队列的尾端。
msgrcv函数用于从消息队列中读取msqid指定的消息
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);- msqid:消息队列标识符(由msgget生成)
- msgp:指向用户自定义的缓冲区(msgp)
- msgsz:接收信息的大小。范围在0~系统对消息队列的限制值
- msgflg:指定在达到系统为消息队列限定的界限时应采取的操作。
- IPC_NOWAIT 如果需要等待,则不发送消息并且调用进程立即返回,errno为EAGAIN
- 如果设置为0,则调用进程挂起执行,直到达到系统所规定的最大值为止,并发送消息
- msqid:消息队列标识符
- msgp:指向用户自定义的缓冲区(msgp)
- msgsz:如果收到的消息大于msgsz,并且msgflg&MSG_NOERROR为真,则将该消息截至msgsz字节,并且不发送截断提示
- msgtyp:用于指定请求的消息类型:
- msgtyp=0:收到的第一条消息,任意类型。
- msgtyp>0:收到的第一条msgtyp类型的消息。
- msgtyp<0:收到的第一条最低类型(小于或等于msgtyp的绝对值)的消息。
- msgflg:用于指定所需类型的消息不再队列上时的将要采取的操作:
- 如果设置了IPC_NOWAIT,若需要等待,则调用进程立即返回,同时返回-1,并设置errno为ENOMSG
- 如果未设置IPC_NOWAIT,则调用进程挂起执行,直至出现以下任何一种情况发生:
- 某一所需类型的消息被放置到队列中。
- msqid从系统只能怪删除,当该情况发生时,返回-1,并将errno设为EIDRM。
- 调用进程收到一个要捕获的信号,在这种情况下,未收到消息,并且调用进程按
signal(SIGTRAP)中指定的方式恢复执行。
毋庸置疑,成功0,失败-1。
其他要注意的是,消息队列数据结构(msqid_ds类型)成员的变化:
成功时:
- msg_qnum 以1为增量递增
- msg_lspid 设置为调用进程的pid
- msg_stime 设置为当前时间。
成功时:
- msg_qnum 以1为增量递减
- msg_lrpid 设置为调用进程的pid
- msg_rtime 设置为当前时间。
该类型需要自己在编程时定义,用于存储消息的内容。
下面给出一个范例,注意,里面的名称随意。
struct msgbuf{
long mtype; //消息类型
char mtext[1];//数组大小编程时自己指定
};Talk is cheap, show me the code!
C语言API包含部分标准C的API、POSIX标准的系统编程API(一些Linux独有的系统API会单独注明)。
大部分头文件源码在/usr/include目录下。
因为涉及到大量的POSIX编程。所以最好下载POSIX函数的man手册。
apt-get install manpages-posix
apt-get install manpages-posix-dev
默认安装了manpages-dev,所以不装POSIX的man手册是可以查看绝大部分API的。
但是不装的话,有些API是不能看到的,比如posix_spawn函数。
yum install man-pages.noarch
关于目录
左侧的目录并非以函数为索引依据,主要是以系统的man手册页面为索引依据。
比如exec里面包含6个函数、pipe里面包含pipe()和pipe2()两个函数,但是它们都是属于一个man页面中。