3)int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);

向msgid代表的消息队列发送一个消息,即将发送的消息存储在msgp指向的msgbuf结构中,消息的大小由msgze指定。

对发送消息来说,有意义的msgflg标志为IPC_NOWAIT,指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待。造成msgsnd()等待的条件有两种:当前消息的大小与当前消息队列中的字节数之和超过了消息队列的总容量;

当前消息队列的消息数(单位"个")不小于消息队列的总容量(单位"字节数"),此时,虽然消息队列中的消息数目很多,但基本上都只有一个字节。

msgsnd()解除阻塞的条件有三个:不满足上述两个条件,即消息队列中有容纳该消息的空间;

msqid代表的消息队列被删除;

调用msgsnd()的进程被信号中断;

调用返回:成功返回0,否则返回-1。

4)int msgctl(int msqid, int cmd, struct msqid_ds *buf);

该系统调用对由msqid标识的消息队列执行cmd操作,共有三种cmd操作:IPC_STAT、IPC_SET 、IPC_RMID。IPC_STAT:该命令用来获取消息队列信息,返回的信息存贮在buf指向的msqid结构中;

IPC_SET:该命令用来设置消息队列的属性,要设置的属性存储在buf指向的msqid结构中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。

IPC_RMID:删除msqid标识的消息队列;

调用返回:成功返回0,否则返回-1。

----------------------------------------------------------------------------------------------------------------------

/*msgserver.c*/

#include #include #include #include #include #include #include

#define   MSG_FILE "msgserver.c"

#define   BUFFER 255

#define   PERM S_IRUSR|S_IWUSR

/* 服务端创建的消息队列最后没有删除,我们要使用ipcrm命令来删除的 */

/* ipcrm -q */

struct msgtype {

long mtype;

char buffer[BUFFER+1];

};

int main()

{

struct msgtype msg;

key_t key;

int msgid;

if((key=ftok(MSG_FILE,'a'))==-1)

{

fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));

exit(1);

}

if((msgid=msgget(key, PERM|IPC_CREAT|IPC_EXCL))==-1)

{

fprintf(stderr, "Creat Message Error:%s\n", strerror(errno));

exit(1);

}

printf("msqid = %d\n", msgid);

while(1)

{

msgrcv(msgid, &msg, sizeof(struct msgtype), 1, 0);

fprintf(stderr,"Server Receive:%s\n", msg.buffer);

msg.mtype = 2;

msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

}

exit(0);

}

/* msgclient.c */

#include #include #include #include #include #include #include #include

#define   MSG_FILE "msgserver.c"

#define   BUFFER 255

#define   PERM S_IRUSR|S_IWUSR

struct msgtype {

long mtype;

char buffer[BUFFER+1];

};

int main(int argc, char **argv)

{

struct msgtype msg;

key_t key;

int msgid;

if(argc != 2)

{

fprintf(stderr,"Usage:%s string\n", argv[0]);

exit(1);

}

if((key=ftok(MSG_FILE,'a'))==-1)

{

fprintf(stderr,"Creat Key Error:%s\n", strerror(errno));

exit(1);

}

if((msgid=msgget(key, PERM))==-1)

{

fprintf(stderr,"Creat Message  Error:%s\n", strerror(errno));

exit(1);

}

msg.mtype = 1;

strncpy(msg.buffer, argv[1], BUFFER);

msgsnd(msgid, &msg, sizeof(struct msgtype), 0);

memset(&msg, '\0', sizeof(struct msgtype));

msgrcv(msgid, &msg, sizeof(struct msgtype), 2, 0);

fprintf(stderr, "Client receive:%s\n", msg.buffer);

exit(0);

}

linux msgctl清除缓存,linux消息队列相关推荐

  1. Python网络编程 8 缓存与消息队列

    前面已经介绍了套接字API以及在Python中使用的基础IP网络操作来构建通信信道的方式.本章研究服务负载较重时常用的两项基本技术:缓存与消息队列.这两项技术有如下一些共同特点: 都是非常强大的工具, ...

  2. Linux进程间通信二 System V 消息队列简介与示例

    1. SystemV消息队列简介 消息队列,顾名思义即是存放消息的队列,内核为每个SystemV 维护了一个msg_queue的结构体,里面记录了每个消息队列的信息. struct msg_queue ...

  3. Linux进程间通讯之消息队列

    首先有个大体的概念:http://www.xefan.com/archives/83703.html 头文件: #include <sys/ipc.h> #include <sys/ ...

  4. Linux IPC实践(7) --Posix消息队列

    1. 创建/获取一个消息队列 #include <fcntl.h> /* For O_* constants */ #include <sys/stat.h> /* For m ...

  5. Linux进程间通信详解(三) —— 消息队列及函数

    消息队列的概念 消息队列就是一个消息的链表,每个消息队列都有一个队列头,用结构struct msg_queue来描述.队列头中包含了该队列的大量信息,包括消息队列的键值.用户ID.组ID.消息数目.读 ...

  6. Linux定时清除缓存脚本与清除命令

    1.脚本cleanCache.sh vim cleanCache.sh #!/bin/bash #每两小时清除一次缓存 echo "开始清除缓存" sync;sync;sync # ...

  7. linux进程间通信:system V消息队列

    文章目录 基本介绍 编程接口 代码实例 消息队列的发送和接收 消息队列中的消息对象的属性控制 基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用 ...

  8. 【Linux系统编程】进程间通信--消息队列

    概述 消息队列提供了一种在两个不相关的进程之间传递数据的简单高效的方法,其特点如下: 1)消息队列可以实现消息的随机查询.消息不一定要以先进先出的次序读取,编程时可以按消息的类型读取. 2)消息队列允 ...

  9. linux查看队列 msg,linux第10天 msg消息队列

    cat /proc/sys/kernel/msgmax最大消息长度限制 cat /proc/sys/kernel/msgmnb消息队列总的字节数 cat /proc/sys/kernel/msgmni ...

  10. Linux下清除缓存 drop_caches, sysctl

    转自 http://blog.csdn.net/sky_qing/article/details/8988461 1. 用命令 free -m 查看一下内存的使用情况: 然后清除缓存后再来查看一下内存 ...

最新文章

  1. pyqt设置按钮可用
  2. 矩阵快速幂 zoj-3690 Choosing number
  3. 译 | Azure 应用服务中的程序崩溃监控
  4. SP2010开发和VS2010专家食谱--第二章节--工作流
  5. Linux文件系统构成
  6. Oracle10gR5GridControl InstallOnLinux
  7. struts mysql乱码_Struts+Hibernate+MyEclipse+Tomcat+MySQL的乱码之解决
  8. NYOJ--975--关于521
  9. 陈纪修老师《数学分析》 第11章:欧式空间上的极限和连续 笔记
  10. AE遮罩路径扭曲插件BOA Boa for Macv1.3.1破解版
  11. jpg格式如何转eps路径_jpg/png格式图片转eps格式的方法总结
  12. 三角函数和差公式的推导
  13. 中英文自动翻译(有道翻译、彩云小译)
  14. Expected property shorthand报错
  15. 社会调查报告包括哪几个部分?
  16. 【牛奶豆腐汤喝出小蛮腰】
  17. 文本蕴涵模型测试过程
  18. 正则表达式(Regex)规范及运用
  19. 【LeetCode-SQL】603. 连续空余座位
  20. html加载富文本_HTML基础

热门文章

  1. 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
  2. jlink接口定义接stm32_图解Stm32使用jlink程序时jtag接口(SW和JTAG模式)的简化方法
  3. access如何保存小数点后_如何设置石材雕刻机原点及断电后怎么保存原点坐标?...
  4. Visual studio插件:Visual Svn 替代工具--AnkhSvn
  5. html给字体设置大小,如何设置html字体大小
  6. ps复制文字到html,【答疑】PS里文字复制粘贴快捷键是什么啊? - 视频教程线上学...
  7. python编写小程序、模拟实现自动按下键盘_Python 实现键盘鼠标按键模拟
  8. 图解js中继承的几种方式
  9. Android性能测试工具Emmagee介绍
  10. Emmagee性能测试简单的使用