首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

进程通信(二)消息队列(System V 消息队列)

一、System V 消息队列简介 消息队列:消息队列的本质是由Linux内核创建用于存放消息的链表,并且其功能是用来存放消息的,所以又称之为消息队列。...在Linux的不同进程,包括有血缘的进程和无血缘的进程,都可以通过Linux消息队列API所得到的消息队列唯一标识符对消息队列进行操作。...二、分析消息队列的数据结构 Linux为了维护消息队列,为消息队列创建了数据结构,接下来我们来分析一下消息队列的结构以及消息队列节点的结构。...内核所设计消息队列的大致模样,这对于我们理解消息队列Linux API有着至关重要的作用。...三、消息队列API分析 msgget函数 1.int msgget(key_t key, int oflag); 返回值:唯一的标识符 关于参数key和参数oflag,请看下图,参考与《Unix网络编程

2.4K20

linux c程序获取shell脚本输出

比如实现一个ping程序来测试网络的连通性,实现ping函数需要写上200~300行代码,为什么不能直接调用系统的ping命令呢?通常在程序通过 system函数来调用shell命令。...使用临时文件   首先想到的方法就是将命令输出重定向到一个临时文件,在我们的应用程序读取这个临时文件,获得外部命令执行结果,代码如下所示:   #define CMD_STR_LEN 1024   int...,在应用程序需要读取文件,然后再删除该临时文件,比较繁琐,优点是实现简单,容易理解。...Linux提供了很多的实用工具和脚本,在程序调用工具和脚本,无疑可以简化程序,从而降低代码的缺陷数目。...Linux shell脚本也是一个强大的工具,我们可以根据需要编制脚本,然后在程序调用自定义脚本。

5.5K20

Linux进程间通信——消息队列(一)

我学习一个东西,喜欢先从整体上了解框架,然后再了解所学习的东西是框架的哪一细分部分。今天就聊一聊Linux系统进程之间的通信。...程序环境:ubuntu16.04 x_64 虚拟机 一、站得高,望得远 有三种IPC(进程间通讯)我们称作XSI IPC,即消息队列、信号量和共享内存 1....标识符和Key 每个内核的IPC结构(消息队列、信号量、共享内存)都用一个非负整数的标识符来进行调用。如,当使用消息队列发送或接收消息队列时,需要知道队列标识符。...(stderr, "msgget failed with error: %d\n", errno); exit(EXIT_FAILURE); } //从队列获取消息,直到遇到end消息为止...运行发送程序,根据提示输入字符串,接收端会收到字符,输入end消息队列 终止。

2.9K20

Linux下可以替换运行程序么?

今天被朋友问及“Linux下可以替换运行程序么?”,以前依稀记得Linux下是可以的(而Windows就不让),于是随口答道“OK”。...结果朋友发来一个执行结果:(test正在运行) # cp test2 test cp: cannot create regular file `test': Text file busy 看起来是程序被占用...Linux由于Demand Paging机制的关系,必须确保正在运行程序镜像(注意,并非文件本身)不被意外修改,因此内核在启动程序后会锁定这个程序镜像的inode。...不过想想也可以宽恕,毕竟ld也是用户态程序,没有权利去锁定inode,也不应与内核的文件系统底层实现耦合。 到这里都还算在情理之中,看起来Linux也都处理的很好。...在思考这个问题的过程,我意识到前面这个测试程序的一个致命漏洞,稍作修改如下: #include int main(int argc, char * argv[]) { loop: foo(

6.3K20

Linux 如何切换相同程序的不同版本

在那篇文章,我们使用 update-alternatives 命令实现从一个 PHP 版本切换到另一个 PHP 版本。...通俗的来说,你可以通过 update-alternatives 命令从系统范围设置程序的版本。如果你希望可以在不同目录动态设置不同的程序版本,该如何完成呢?在这种情况下, alt 工具可以大显身手。...使用 alt 工具在 Linux 系统中切换相同程序的不同版本 如我之前所述,alt 只影响当前目录。换句话说,当你进行版本切换时,只在当前目录生效,而不是整个系统范围。 下面举例说明。...我在我的 Ubuntu 系统安装了两个版本的 PHP,分别为 PHP 5.6 和 PHP 7.2;另外,在 myproject 目录包含一些 PHP 应用。...--config java $ sudo update-alternatives --config javac 总结 以上所述是小编给大家介绍的Linux 如何切换相同程序的不同版本,希望对大家有所帮助

3.6K31

Linux64位程序的漏洞利用

不过, 现在毕竟已经是2018年了, 64位程序也逐渐成为主流, 尤其是在Linux环境. 因此本篇就来说说64位下的利用与32位下的利用和缓解绕过方法有何异同....如果在实际程序也这么不巧遇到这种情况怎么办? 这就要用到下面的方法了...., 主要利用的是Linux 实现ASLR的设计缺陷, 在程序启用PIE时会导致加载地址空间(区域)和动态库相同, 从而导致ASLR熵减少....对于客户端程序, 我们用程序的puts/printf可以比较简单地打印(泄漏)出libc的地址, 只需要传入合适的参数....关键是__libc_csu_init这一段代码是所有GNU/cc编译链都会添加带可执行文件的, 这意味着对于大多数Linux x64下的程序栈溢出漏洞都可以用该方式绕过ASLR执行程序.

1.2K70

Linux进程间通信(二) - 消息队列

消息队列 消息队列是Linux IPC很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据。...消息队列的每条消息通常具有以下属性: Ø 一个表示优先级的整数; Ø 消息的数据部分的长度; Ø 消息数据本身; 下面我们分别阐述POSIX消息队列和System V消息队列,这2种消息队列目前Linux...在Linux 2.6该类型的定义为整型: #include typedef int mqd_t; // 关闭消息队列 mqd_t mq_close(mqd_t mqdes...它的原型为: int msgget(key_t key, int msgflg); 与其他的IPC机制一样,程序必须提供一个键来命名某个特定的消息队列。...调用成功时,该函数返回放到接收缓存区的字节数,消息被复制到由msg_ptr指向的用户分配的缓存区,然后删除消息队列的对应消息。

6.1K90

进程间通讯(五).message queue(1)

,存储在内核,由消息队列标识符标识 一个消息可以看成一个记录,具有特定的格式以及特定的类别 对消息队列有写权限的进程可以向消息队列按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列读走消息...应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。...消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。...对于每个消息队列,Linux 内核为标识符分配44B,为消息队列数据结构分配 96B。为了获得更多的消息队列资源,可以动态增加 msgmni 取值。...(key,IPC_CREAT|0600))) //创建一个消息队列,将id存到qid { perror("msgget"); return res; } printf

98010

Linux内核编程--消息队列

一,关于Linux的IPC IPC的意思是“ 进程间通信机制”,Linux内核有三种常用IPC对象可以拿来做进程间通信--消息队列,共享内存,信号量。...这三种IPC对象在Linux内核中都以链表的形式存储,它们都有特定的ID来标识(消息队列标识符msqid、共享内存标识符shmid,信号量标识符semid)。...msgget()返回消息队列ID后,后面的发生/接收操作都基于这个ID来进行。...msgrcv会将读到的消息从指定队列删除,并将其内容填到*msgp指定的缓存地址。...IPC_RMID:删除消息队列,这个操作可以解除消息队列造成的进程阻塞 IPC_INFO:获得系统对消息队列做的限制 * 消息队列不会在程序退出后自动删除,需要在程序中使用msgctl()进行删除(cmd

4.3K20

调皮的程序员:Linux之父雕刻在Linux内核的故事

(本文同步发布于:http://www.52im.net/thread-1859-1-1.html) 2、代码隐藏着“feel dead”这句话 启动Linux系统,Ctrl + Alt + T打开一个终端窗口...因为应用程序调用这个系统服务的时候必须使用这一系列常量,因为它们的定义写在uapi目录下的reboot.h,即: /*  * Magic values required to use _reboot...        369367448 #define        LINUX_REBOOT_MAGIC2C        537993216 注意啊:在这个文件和文档,代表生日的四个常量都是以十进制表达的...内核代码,而且使它们成为Linux API的一部分。...只要Linux系统还在,那么这些常量就将永远使用,因为API意味着用户态和内核态的法定接口。为了保障应用程序的兼容性,不可轻易变化。 6、写在最后 无论哪种文化,家庭都有着极其重要的地位。

88640

Linux进程间通信(上)之管道、消息队列实践

管道是Linux支持的最初Unix IPC形式之一,管道与管道之间通信其实就是一个文件,但它不是一个普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统而且只存在内存。...} } close(fd); return 0; } 下面先将fifo_write.c和fifo_read.c分别编译成fifo_write和fifo_read两个可执行程序...接下来,先运行fifo_write,然后打开另一个终端,接着运行fifo_read,运行fifo_write的时候,可以看到程序阻塞在终端: ?...运行fifo_read,这时候,可以看到从管道获取的字符串hello write_fifo,如下图所示: ? 管道读取结束后,fifo_write这个程序也就不会在阻塞在终端了,如下图所示: ?...int msgget(key_t key, int msgflg); 与其他的IPC机制一样,程序必须提供一个键来命名某个特定的消息队列。

2.2K10
领券