Linux系统调用--msgsnd/msgrcv函数简介
2012-09-17 22:13
225 查看
(2009-10-22)
【msgsnd/msgrcv系统调用】
功能描述:
在消息队列上进行收发消息。为了发送消息,调用进程对消息队列必须有写权限,接收消息时必须有读权限。
用法:
#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:消息队列的识别码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf {
long mtype; /* 消息类型,必须 > 0 */
char mtext[1]; /* 消息文本 */
};
msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。
返回说明:
成功执行时,msgsnd()返回0,msgrcv()返回拷贝到mtext数组的实际字节数。失败两者都返回-1,errno被设为以下的某个值
(1)对于msgsnd
EACCES:调用进程在消息队列上没有写权限,同时没有CAP_IPC_OWNER权限
EAGAIN:由于消息队列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT标志,消息不能被发送
EFAULT:msgp指针指向的内存空间不可访问
EIDRM:消息队列已被删除
EINTR:等待消息队列空间可用时被信号中断
EINVAL:参数无效
ENOMEM:系统内存不足,无法将msgp指向的消息拷贝进来
(2)对于msgrcv
E2BIG:消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROR
EACCES:调用进程没有读权限,同时没有CAP_IPC_OWNER权限
EAGAIN:消息队列为空,并且msgflg中没有指定IPC_NOWAIT
EFAULT:msgp指向的空间不可访问
EIDRM:当进程睡眠等待接收消息时,消息已被删除
EINTR:当进程睡眠等待接收消息时,被信号中断
EINVAL:参数无效
ENOMSG:msgflg中指定了IPC_NOWAIT,同时所请求类型的消息不存在
转自:http://kruck.banzhu.net/article/kruck-4-136687.html
【msgsnd/msgrcv系统调用】
功能描述:
在消息队列上进行收发消息。为了发送消息,调用进程对消息队列必须有写权限,接收消息时必须有读权限。
用法:
#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:消息队列的识别码。
msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构,形态如下
struct msgbuf {
long mtype; /* 消息类型,必须 > 0 */
char mtext[1]; /* 消息文本 */
};
msgsz:消息的大小。
msgtyp:从消息队列内读取的消息形态。如果值为零,则表示消息队列中的所有消息都会被读取。
msgflg:用来指明核心程序在队列没有数据的情况下所应采取的行动。如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG。当msgflg为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式。
返回说明:
成功执行时,msgsnd()返回0,msgrcv()返回拷贝到mtext数组的实际字节数。失败两者都返回-1,errno被设为以下的某个值
(1)对于msgsnd
EACCES:调用进程在消息队列上没有写权限,同时没有CAP_IPC_OWNER权限
EAGAIN:由于消息队列的msg_qbytes的限制和msgflg中指定IPC_NOWAIT标志,消息不能被发送
EFAULT:msgp指针指向的内存空间不可访问
EIDRM:消息队列已被删除
EINTR:等待消息队列空间可用时被信号中断
EINVAL:参数无效
ENOMEM:系统内存不足,无法将msgp指向的消息拷贝进来
(2)对于msgrcv
E2BIG:消息文本长度大于msgsz,并且msgflg中没有指定MSG_NOERROR
EACCES:调用进程没有读权限,同时没有CAP_IPC_OWNER权限
EAGAIN:消息队列为空,并且msgflg中没有指定IPC_NOWAIT
EFAULT:msgp指向的空间不可访问
EIDRM:当进程睡眠等待接收消息时,消息已被删除
EINTR:当进程睡眠等待接收消息时,被信号中断
EINVAL:参数无效
ENOMSG:msgflg中指定了IPC_NOWAIT,同时所请求类型的消息不存在
转自:http://kruck.banzhu.net/article/kruck-4-136687.html
相关文章推荐
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--msgsnd/msgrcv函数详解
- Linux系统调用--getrusage函数详解
- Linux系统调用-- mmap/munmap函数详解
- Linux系统调用-- unlink函数详解
- Linux下调用系统函数的错误捕获
- Linux常见文件系统操作命令、进程调用命令、进程控制C函数、时间函数
- linux应用程序(5)---系统调用函数和库函数编程
- Linux中mmap与munmap函数系统调用
- linux系统调用--fcntl函数用法总结
- Linux系统调用-Printf从函数库到OS跟踪流程
- linux下c编程系统调用之有名管道FIFO函数的使用及案例
- Linux系统调用--fcntl函数详解
- linux下编写自己的系统调用函数
- Linux系统调用--fcntl函数详解
- Linux系统调用--getrlimit()与setrlimit()函数详解
- linux 系统启动 函数调用关系
- (cc)2.6版本Linux上替换系统调用函数实现隐藏文件学习
- Linux系统调用-- mmap/munmap函数详解【转】