shmget

ROS系统节点间的内存共享

痞子三分冷 提交于 2020-01-31 01:08:38
ROS系统节点间的内存共享 为什么要用内存共享? 在C++中怎么共享内存? 写进程 读进程 将上述代码移植进ROS 创建writeshmInRos.cpp 创建readshmInRos.cpp 为什么要用内存共享? 答案是ROS提供的服务或者话题都是通过网络来实现的。照顾到ROS节点可能架设在不同的硬件上这一点,这样做更具普遍性,但对于在同一台设备的两个节点间传输数据是非常不友好的。因为其既没必要性又浪费大量资源,且效率低下,容易造成网络堵塞,延时严重。 那么怎么改善最好呢,自然是进程间的内存共享。我们直接让两个节点共享一片物理内存,在里面做一个队列数据结构,一个往里面写,一个去里面读。 下面我们就来实现这一功能。跟上篇文章一样,我们先实现纯净的Linux C++版本,然后再把代码移植到ROS的节点中。 在C++中怎么共享内存? 实现Linux进程间的内存共享,主要参考 这篇文章 。 写进程 “写”进程,流程如下: 获得key, ftok() 使用key来创建一个共享内存 shmget() 映射共享内存(得到虚拟地址), shmat() 使用共享内存, 往共享内存中写入数据 解除映射 shmdt() 如果共享内存不再使用,可以使用shmctl()销毁共享内存 代码如下: # include <stdio.h> # include <unistd.h> # include

使用Share Memory时的shmget失败与ftok的关系。

此生再无相见时 提交于 2019-12-18 03:40:56
对于长期运行的系统,产生的日志是大量的,即使每2秒一条,一天也有4W多条。假如我们只需要在想观察的时候动态地看到当前记录或计数,那么可以将日志的信息写到一个共享内存区,然后写一个LogReader,去访问这个共享内存区即可。 要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 需要删除这块内存的时候,步骤为 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块共享内存 shmctl()或者命令行下ipcrm 过程会用到以下的这些函数: int shmget( key_t shmkey , int shmsiz , int flag ); 创建一个新的共享内存区或打开一存在的共享内存区 void *shmat( int shmid , char *shmaddr , int shmflag ); 返回共享内存区在调用进程内的起始地址。 shmaddr最好设置为NULL,这样系统会替我们选择地址,可移植性更强;否则会根据shmflag时候指定了SHM_RND,将共享内存区附接到shmaddr参数指定的地址。 今天调试的时候发现了以下的这些问题:两个需要通信的进程使用一个同样的字符串调用ftok生成key,并对该key调用shmget,其中有一个不能访问到共享内存区。查阅了UNP2才明白了。

强大的strace命令用法详解

会有一股神秘感。 提交于 2019-11-29 13:19:24
强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm   strace是什么?   按照strace官网的描述, strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。 strace底层使用内核的ptrace特性来实现其功能。   在运维的日常工作中,故障处理和问题诊断是个主要的内容,也是必备的技能。strace作为一种动态跟踪工具,能够帮助运维高效地定位进程和服务故障。它像是一个侦探,通过系统调用的蛛丝马迹,告诉你异常的真相。   strace能做什么?   运维工程师都是实践派的人,我们还是先来个例子吧。   我们从别的机器copy了个叫做some_server的软件包过来,开发说直接启动就行,啥都不用改。可是尝试启动时却报错,根本起不来!   启动命令:   ./some_server ../conf/some_server.conf   输出:   FATAL: InitLogFile failed iRet: -1!   Init error: -1655   为什么起不来呢?从日志看,似乎是初始化日志文件失败,真相到底怎样呢?我们用strace来看看。   strace -tt -f .