消息处理机制linux,Linux通讯机制之消息队列 msg

2023-05-16

先预览一下今天要玩的几组函数:

msgget msgctl msgrcv msgsnd   ->消息队列

shmget shmctl shmat shmdt     ->共享内存

semget semctl semop           ->信号量

找到一点相同点了吧,get->ctrtl;message receive send;shm at->dt;sem operation;

先来玩msg:

willisway1:

#include

#include #include #include

#include "comm.h"

#define SIZE     1024

int main(void)

{

key_t key;

int ret;

char buf[SIZE];

getcwd(buf, SIZE);

key = ftok(buf, PROJNO);

ret = msgget(key, IPC_CREAT | 0600);

printf("ret = %d\n", ret);

return 0;

}

分析:创建一个消息队列,首先需要一个key值,可以理解为消息队列的描述符;这个key值由ftok得到,即为ftok的返回值;所谓消息队列,本质上还是一段内存,一段特殊用途的内存,为了操作这段内存,至少两个条件,指针和大小;getcwd获取当前目录,试着删除那一行,看看会出什么问题。

willisway2:

#include

#include #include #include

#include "comm.h"

#define SIZE 1024

struct student {

long type;

char name[SIZE];

int chinese;

int math;

};

int main(void)

{

char buf[SIZE];

int key, ret;

int msgid;

struct student stu = { 1, "stu01", 60, 60 };

getcwd(buf, SIZE);

key = ftok(buf, PROJNO);

if (key == -1)

{

perror("ftok");

return -1;

}

msgid = msgget(key, 0);

if (msgid == -1)

{

perror("msgget");

return -1;

}

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

ret = msgsnd(msgid, &stu, sizeof(stu) - sizeof(long), 0);

if (ret != 0)

{

perror("msgsnd");

return -1;

}

return 0;

}

分析:msgsnd首先需要msgid,send目标地址的指针,send的大小。

willisway3:

#include

#include #include #include

#include "comm.h"

#define SIZE 1024

struct student {

long type;

char name[SIZE];

int chinese;

int math;

};

int main(void)

{

char buf[SIZE];

int key, ret;

int msgid;

struct student stu;

getcwd(buf, SIZE);

key = ftok(buf, PROJNO);

if (key == -1)

{

perror("ftok");

return -1;

}

msgid = msgget(key, 0);

if (msgid == -1)

{

perror("msgget");

return -1;

}

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

ret = msgrcv(msgid, &stu, sizeof(stu) - sizeof(long), 0, 0);

if (ret == -1)

{

perror("msgrcv");

return -1;

}

printf("name = %s, chinese = %d, math = %d\n", stu.name, stu.chinese, stu.math);

return 0;

}

分析:msgsnd msgrev参数大致相同,也需要msgid,内存地址。

这就是消息队列的处理机制,看懂了一点都不复杂,并且参数的格式都有很强的规律性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息处理机制linux,Linux通讯机制之消息队列 msg 的相关文章

  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • 从 Linux 命令行发送 SNMP 陷阱消息

    Folks 我需要从 Linux 命令行使用此命令 snmptrap 将自定义消息发送到陷阱侦听器 我需要根据用户设置在 v1 和 v2c 中发送相同的消息 这是我发现的 For v1 snmptrap v 1 c Tas hostname
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • linux下如何获取昨天和前天?

    我想在变量中获取 sysdate 1 和 sysdate 2 并回显它 我正在使用下面的查询 它将今天的日期作为输出 bin bash tm date Y d m echo tm 如何获取昨天和前天的日期 这是另一种方法 对于昨天来说 da
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • Bash 脚本 - 迭代 find 的输出

    我有一个 bash 脚本 其中需要迭代 find 命令输出的每一行 但似乎我正在迭代 find 命令中的每个单词 以空格分隔 到目前为止我的脚本看起来像这样 folders find maxdepth 1 type d for i in f
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • Linux 上的 Python 3.6 tkinter 窗口图标错误

    我正在从 Python GUI 编程手册 学习 Python GUI 某项任务要求我通过将以下代码添加到我的配方中来更改窗口图标 Change the main windows icon win iconbitmap r C Python3
  • 如何查明 Ubuntu 上安装了哪个版本的 GTK+?

    我需要确定 Ubuntu 上安装了哪个版本的 GTK 男人似乎不帮忙 这个建议 https stackoverflow com a 126145 会告诉您安装了哪个 2 0 的次要版本 不同的主要版本将具有不同的包名称 因为它们可以在系统上
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder

随机推荐