2011-08-02 09:39 888人阅读 评论(1)

通过msgctl()函数,我们可以直接控制消息队列的行为。它在系统库linux/msg.h 中的

定义是这样的:

系统调用: msgctl()

函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )

返回值: 0 on success

-1 on error: errno = EACCES (No read permission and cmd is IPC_STAT)

EFAULT (Address pointed to by buf is invalid with

IPC_SET and IPC_STAT commands)

EIDRM (Queue was removed during retrieval)

EINVAL (msgqid invalid, or msgsz less than 0)

EPERM (IPC_SET or IPC_RMID command was

issued, but calling process does not have

write (alter) access to the queue)

函数的第一个参数msgqid 是消息队列对象的标识符。

第二个参数是函数要对消息队列进行的操作,它可以是:

IPC_STAT

取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构

中。

IPC_SET

设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds

结构给出。

IPC_EMID

将队列从系统内核中删除。

这三个命令的功能都是明显的,所以就不多解释了。唯一需要强调的是在IPC_STAT

命令中队列的msqid_ds 数据中唯一能被设定的只有msg_perm 成员,其是ipc_perm 类型的

数据。而ipc_perm 中能被修改的只有mode,pid 和uid 成员。其他的都是只能由系统来设定

的。

最后我们将使用msgctl()函数来开发几个封装函数作为本节的例子:

IPC_STAT 的例子:

int get_queue_ds( int qid, struct msgqid_ds *qbuf )

{

if( msgctl( qid, IPC_STAT, qbuf) == -1)

{

return(-1);

}

return(0);

}

IPC_SET 的例子:

int change_queue_mode( int qid, char *mode )

{

struct msqid_ds tmpbuf;

/* Retrieve a current copy of the internal data structure */

get_queue_ds( qid, &tmpbuf);

/* Change the permissions using an old trick */

sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);

/* Update the internal data structure */

if( msgctl( qid, IPC_SET, &tmpbuf) == -1)

{

return(-1);

}

return(0);

}

IPC_RMID 的例子:

int remove_queue( int qid )

{

if( msgctl( qid, IPC_RMID, 0) == -1)

{

return(-1);

}

return(0);

}

linux msgctl函数,msgctl()函数相关推荐

  1. Linux系统中的函数

    Linux系统中的函数: 一.进程控制 fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtables ...

  2. sleep头文件linux,Linux下的sleep函数 要用的话得包涵什么头文件啊?

    Linux下的sleep函数 要用的话得需要#include sleep把进程的运行状态改为睡眠,将其从系统可执行队列去掉,这样系统就不会调度到该进程,不会分配CPU时间片,同时根据该进程的睡眠时间, ...

  3. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  4. Linux编程下open()函数的用法

    Linux编程下open()函数的用法 open(打开文件)  相关函数:  read,write,fcntl,close,link,stat,umask,unlink,fopen 表头文件 : #i ...

  5. Linux的shell脚本函数教程

    Linux的shell脚本函数教程 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.shell中函数使用示例 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.she ...

  6. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  7. linux send与recv函数详解

    linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t nb ...

  8. linux编程之pthread_create函数

    linux编程之pthread_create函数UNIX环境创建线程函数, 具体格式: #include<pthread.h> int pthread_create(pthread_t * ...

  9. linux下的系统调用函数到内核函数的追踪

    Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html 使用的 glibc : glibc-2.17 使用的 lin ...

  10. linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID

    请教linux下c语言函数fork父进程打印子进程的PID 关注:296  答案:2  信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...

最新文章

  1. python 一个文本是否包含另一字符串 in find是区分大小写的
  2. 计算机网络:三层ISP结构
  3. 机器学习系列之手把手教你实现一个 naiveBayes
  4. leetcode 372. Super Pow | 372. 超级次方(快速幂)
  5. 机器学习基石HOW部分(2)
  6. 判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验
  7. docker安装linux安装mysql_怎么启动mysql-linux 怎么安装mysql?怎么在docker搭建mysql8?docker安装mysql...
  8. SAP License:SAP货币转换
  9. android getid,Process.myTid()和Thread.currentThread().getId()区别
  10. 数位 dp 最低位最高位之差绝对值大于2_面试必备——手撕代码(2)“买卖股票的最佳时机”...
  11. Android 头像更换从相册选取崩溃
  12. Linux HaProxy安装/启动/简单配置教程
  13. uos命令_uos如何使用终端界面的基本操作uos桌面版v20操作手册
  14. pptpd搭建过程中 启动成功但不显示ppp0端口
  15. 二叉查找树,二叉平衡树
  16. REINFORCEMENT LEARNING USING QUANTUM BOLTZMANN MACHINES利用量子波兹曼机进行强化学习
  17. CDH和Hadoop的区别
  18. java之getResource方法
  19. 计算机显示找不到gpedit,Win7系统打开组策略提示找不到文件gpedit.msc怎么办
  20. 银联电子支付ChinaPay支付回调验证问题

热门文章

  1. 实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)
  2. Ubuntu14.04安装Matlab R2013b
  3. 迭代式客户端-服务系模型
  4. vue-cli起服务chrome不能打断点——每周汇总(第一周)
  5. iOS 10 (X8)上CoreData的使用(包含创建工程时未添加CoreData)
  6. jQuery实现购物车多物品数量的加减+总价计算
  7. 学习Linux——计算机概论
  8. c#(6)——数组的应用和二维数组
  9. Eclipse启动jboss局域网无法访问的问题
  10. appium定位元素java篇【转】