第一范文网 - 专业文章范例文档资料分享平台

Linux的消息函数的分析

来源:用户分享 时间:2025/7/26 3:59:24 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

. 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况之一发生:

. 消息被发送出去.

. 消息队列标志被系统删除.系统调用返回-1.

. 调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.

调用成功后,对应指定的消息队列的相关结构做如下动作: . 消息数(msg_qnum)加1.

. 消息队列最近发送进程号(msg_lspid)改为调用进程号. . 消息队列发送时间(msg_stime)改为当前系统时间. 以上信息可用命令ipcs -a看到. 返回值:发送成功则返回0,否则返回-1.

3.3 Msgrcv:( 负责)

功能:用msgrcv函数系统调用从msqid消息队列中读取一条信息并将其放

入消息段指针msgp指向的结构。msgsz给出mtext的字节数, 如果所接收的消息比msgsz大且msgflg&MSG_NOERROR为真,则按msgsz的大小截断而不通知调用进程。从消息队列中取得指定类型的消息.。 说明:系统调用从由msqid指定的消息队列中读取一个由msgtyp指定类型

的消息到由msgp指向的缓冲区中,同样的,该缓冲区的结构如前所述,包括消息类型和消息正文.msgsz为可接收的消息正文的字节数.若接收到的消息正文的长度大于msgsz,则会被截短到msgsz字节为止(当消息标志msgflg&MSG_NOERROR为真时),截掉的部份将被丢失,而且不通知消息发送进程. msgtyp指定消息类型:

. 为0则接收消息队列中第一个消息.

. 大于0则接收消息队列中第一个类型为msgtyp的消息.

. 小于0则接收消息队列中第一个类型值不小于msgtyp绝对值且类

型值又最小的消息. msgflg指定操作行为:

. 若(msgflg&IPC_NOWAIT)是真的,调用进程会立即返回,若没有接收

到消息则返回值为-1,error设置为ENOMSG.

. 若(msgflg&IPC_NOWAIT)不是真的,则调用进程会被挂起直到下面情况之一发生:

. 队列中的消息的类型是有效的.

. 消息队列标志被系统删除.系统调用返回-1.

. 调用进程接收到未被忽略的中断信号,调用进程继续执行或被终止.

调用成功后,对应指定的消息队列的相关结构做如下动作: . 消息数(msg_qnum)减1.

. 消息队列最近接收进程号(msg_lrpid)改为调用进程号. . 消息队列接收时间(msg_rtime)改为当前系统时间. 以上信息可用命令ipcs -a看到.

返回值:调用成功则返回值等于接收到实际消息正文的字节数.不成功则返回-1.

3.4 Msgctl:(周健 负责)

功能:在消息队列上执行指定的操作。根据参数的不同和权限的不同,可以

执行检索、删除等等操作。主要由sys_msgctl执行。

说明:系统调用提供一系列消息控制操作,操作动作由cmd定义,以下cmd定

义值表明了各操作动作的定义.

. IPC_STAT:将msqid相关的数据结构中各个元素的当前值放入由buf指向的结构中.

. IPC_SET:将msqid相关的数据结构中的下列各元素设置为由buf指

向的结构中的对应值. msg_perm.uid msg_perm.gid msg_perm.mode msg_qbytes

该命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的进程或有效UID有合适权限的进程操作.

只有具有合适权限的用户才能增加msg_qbytes的值.

. IPC_RMID:删除由msqid指示的消息队列.将它从系统中删除并破坏相关的数据结构.

该命令只能由有效UID等于msg_perm.cuid或msg_perm.uid的进程或

有效UID有合适权限的进程操作. 返回值:调用成功则返回值为0,否则为-1.

4 LINUX的消息函数各个子模块相关函数代码分析结果

4.1 有关常量及相关错误信息的含义:( 负责)

4.1.1 常量含义:

static struct msqid_ds *msgque[MSGMNI]; //消息队列 static int msgbytes = 0; //消息队列中所有消息的总字节数 static int msghdrs = 0; //消息队列的队头 static unsigned short msg_seq = 0;

static int used_queues = 0; //已用的消息队列数 static int max_msqid = 0; //消息队列最大的ID值

static struct wait_queue *msg_lock = NULL; //消息队列锁定,不让等待进程进入

4.1.2 错误信息含义

EINVAL EFAULT EIDRM EACCES EAGAIN

22 /* Invalid argument */ 14 /* Bad address */ 43 /* Identifier removed */ 13 /* Permission denied */ 11 /* Try again */

EINTR 4 /* Interrupted system call */

ENOMEM 12 /* Out of memory */ E2BIG

7 /* Arg list too long */

ENOMSG 42 /* No message of desired type */ ENOSPC

28 /* No space left on device */

ENOMEM 12 /* Out of memory */ EPERM ENOENT EEXIST

1 /* Operation not permitted */ 2 /* No such file or directory */ 17 /* File exists */

4.2 函数sys_msgget的分析 (李锐 负责)

4.2.1 代码及注释

asmlinkage int sys_msgget (key_t key, int msgflg) { int id, ret = -EPERM;

struct msqid_ds *msq; lock_kernel(); //锁内核

if (key == IPC_PRIVATE) //判断调用的参数key中是否指定了IPC_PRIVATE

即判断调用者需要一个新队列;

ret = newque(key, msgflg); //如果调用的参数key中指定了

IPC_PRIVATE则调用newque函数新建一个队列,并返回新建队列的序列号ID

else if ((id = findkey (key)) == -1) { //如果调用的参数key中没有

指定IPC_PRIVATE,则调用findkey函数来搜索一下是否有这个键值指定的队列,并用把函数的返回值赋给参数ID

if (!(msgflg & IPC_CREAT)) //如果key键值未被使用,则判断调用的

参数msgflg中是否设置了IPC_CREAT(00001000)位

ret = -ENOENT; //如果调用的参数msgflg中设置了

IPC_CREAT(00001000)位,则返回错误,错误类型ENOENT(No such file or directory)

搜索更多关于: Linux的消息函数的分析 的文档
Linux的消息函数的分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c9y9354nutx23x6i11q5w_3.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top