小编gim*_*ilk的帖子

如何测试linux用户空间应用程序中的地址是否可读

出于调试目的,我需要测试指针以查看它是否指向有效的可读页面.目前我正在解析/ proc/[pid]/maps以查看地址是否映射好,但这看起来有点啰嗦.有没有更好的办法?谢谢.

linux memory segmentation-fault memory-address

20
推荐指数
1
解决办法
4931
查看次数

Unix:在进程之间共享已映射的内存

我有一个预先构建的用户空间库,其中包含一个API

void getBuffer (void **ppBuf, unsigned long *pSize);
void bufferFilled (void *pBuf, unsigned long size);
Run Code Online (Sandbox Code Playgroud)

想法是我的代码从lib请求一个缓冲区,用东西填充它,然后把它交给lib.

我希望另一个进程能够填充此缓冲区.我可以通过shm*/shm_*API创建一些新的共享缓冲区,让其他进程填充,然后将其复制到lib的本地进程中的lib缓冲区,但这会产生额外的开销(可能很大)复制.

有没有办法共享已为进程映射ALREADY的内存?例如:

[local lib process]
getBuffer (&myLocalBuf, &mySize);
shmName = shareThisMemory (myLocalBuf, mySize);

[other process]
myLocalBuf = openTheSharedMemory (shmName);
Run Code Online (Sandbox Code Playgroud)

这样,其他进程可以直接写入lib的缓冲区.(进程之间的同步已经处理好,所以没有问题).

memory shared ipc

14
推荐指数
2
解决办法
5002
查看次数

cmake自定义命令来复制和重命名

我有一个生成.so库的现有cmake文件.我想修改它,然后它将复制.so命名的其他东西.这大致是我所拥有的:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7)
PROJECT(test1)

SET(TEST_SOURCES f1.c)
ADD_LIBRARY(test SHARED ${TEST_SOURCES})
ADD_CUSTOM_COMMAND(
    OUTPUT custom1
    COMMAND cp libtest.so custom1
    DEPENDS libtest.so)
Run Code Online (Sandbox Code Playgroud)

我意识到有比硬编码库名更好的方法,我只是这样做,而我试图弄清楚如何让它工作.我错过了什么会导致我的复制/重命名自定义命令运行?注意:这不是安装时间的事情.谢谢

command cmake

9
推荐指数
3
解决办法
1万
查看次数

在Linux中查找共享库的加载地址

在运行时,我需要打印一个地址,然后找到该地址所属的功能.这些函数位于共享库中,因此不在固定地址.我的地图文件显然只显示每个共享库func的相对偏移量.是否有可能在运行时查询已加载库的位置,以便我可以从我的地址中减去该值以获得正确的映射文件偏移量?

目前我正在做一个有点hacky的approch,我也打印出库中一个函数的地址,然后在map文件中找到该函数来确定加载地址必须在哪里.我宁愿有一个通用的方法,不要求你命名一个引用函数.

(GDB在我的设置中不可用).谢谢.

linux load shared memory-address

8
推荐指数
2
解决办法
8300
查看次数

如何在Linux下生成系统范围的唯一ID

我正在研究多进程Linux系统,需要生成唯一的ID.安全性不是一个考虑因素,所以从零开始并计数的ID生成器就可以了.它也只是在本地机器内,不涉及网络.显然,实现这一点并不难,但我只是想知道是否已经提供了任何东西(最好是轻量级的).

linux unique

8
推荐指数
1
解决办法
8537
查看次数

从decltype(someFunction)中提取参数类型列表

我有一个可变参数模板,表示函数的参数列表,例如:

void myFunc (int,int,std::string) { }
template<typename... Args> class MyTemplateClass { };
...
MyTemplateClass<int,int,std::string> myConcrete; // for use with myFunc later
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以从decltype(func)中提取参数类型来节省必须手动编写它们,例如:

MyTemplateClass<something_like_decltype(myFunc)> myConcrete;
Run Code Online (Sandbox Code Playgroud)

即在这种情况下decltype会给我"void(int,int,string)"但是有没有办法只提取"int,int,string"部分以便在变量模板中使用?

注意:我必须使用可变参数模板方法,因为在模板中它依次对每个参数类型执行处理.

c++ templates variadic decltype c++11

8
推荐指数
2
解决办法
1101
查看次数

Linux:检查套接字/管道是否损坏而不执行read()/ write()

我有一段简单的代码,可以定期将数据写入传递给它的fd.fd很可能是一个管道或插座,但可能是任何东西.每当我写()时,我都可以检测到套接字/管道何时关闭/断开,因为我收到了EPIPE错误(我忽略了SIGPIPE).但是我不会一直写到它,所以可能很长时间都没有检测到关闭的套接字.我需要尽快对封闭做出反应.有没有一种方法来检查fd而不必写一个write()?如果我不写任何东西,我可以定期这样做.

sockets linux pipe

7
推荐指数
1
解决办法
6755
查看次数

用于获取匹配的正则表达式的一部分的awk语法

我确定这很容易,所以道歉.在Perl中我可能会做类似的事情

my $str = "foo=23";
$str ~= m/foo=([0-9]+)/
print "foo value is " . $1
Run Code Online (Sandbox Code Playgroud)

即在正则表达式中使用括号以便稍后可以将比赛的一部分称为$ 1,$ 2等.在awk中等效的是什么?

regex perl awk match

7
推荐指数
2
解决办法
1万
查看次数

Linux:窥探信号而不会破坏后续核心转储的寄存器?

当我得到coredump-cause信号时,我想运行自己的处理程序将siginfo_t和ucontext_t结构复制到全局变量,以便可以在核心转储中访问它们.目前在我的处理程序结束时,我重新分配默认处理程序并调用raise(thesig).这样做的问题是核心转储"信息寄存器"显示了我的处理程序中寄存器的状态,而不是原始信号时的状态.我意识到,因为我已经保存了ucontext_t,我可以查看原始寄存器值,但是当核心转储在团队中传递时,这些知识可能会丢失/遗忘.

所以我的问题是:有没有办法重新加载信号,并确保核心转储文件保持原始信号的寄存器状态?我想也许我可以使用一些内联asm来手动恢复处理程序末尾的所有reg,然后返回到导致信号的指令而不是调用raise(),但我不确定我们是否可以保证重新 - 尝试该指令将导致与第一次尝试相同的信令行为.

linux gdb coredump signals

5
推荐指数
1
解决办法
343
查看次数

Linux:打开命名管道进行写入时超时

我有一个进程通过命名管道写入另一个进程。读取器进程可能会出现异常并且不打开管道进行读取。如果发生这种情况,我的正常写入进程将挂起其 open() 调用。我希望写入器能够在打开管道时超时,以便在读取器没有及时打开管道末端时它可以清理并继续运行。非阻塞 open() 立即返回错误。

linux timeout named-pipes

5
推荐指数
1
解决办法
3030
查看次数