小编app*_*app的帖子

执行默认信号处理程序

我已经编写了一个应用程序,我在linux中为不同的信号注册了信号处理程序的数量.在过程接收到信号后,控制转移到我已注册的信号处理程序.在这个信号处理程序中,我做了一些我需要做的工作,然后我想调用默认信号hander即SIF_DFLSIG_IGN.然而,SIG_DFLSIG_ING是两个宏分别扩展到数值0和1,它们是无效的函数的地址.

有什么方法我可以调用默认操作即SIG_DFLSIG_IGN

为了达到 SIG_DFL或者SIG_ING我调用exit(1)的效果而且什么都不做.但对于像SIGSEGV我这样的信号也希望有核心转储.一般来说,我希望我的默认行为与操作系统的操作方式SIG_DFL相同SIG_IGN,并忽略相同的行为.

c linux signals handlers

19
推荐指数
4
解决办法
3万
查看次数

变量名,C 中运行时的函数参数

是否可以在 C 程序中在运行时知道函数参数和变量的名称类型?例如,如果我有一个函数:

int abc(int x, float y , somestruct z ){
    char a;
    int b ;
}
Run Code Online (Sandbox Code Playgroud)

我可以知道在这个函数内部abc(),参数和变量的名称是什么,在这种情况下它的x, y, z, ab它们的类型是int, float, somestruct, char, int

说是否还有另一个功能:

float some_func(specialstruct my_struct, int index){

} 
Run Code Online (Sandbox Code Playgroud)

我应该知道参数 name 是my_structindex类型是specialstruct, int

我在运行时需要这些信息?

我可以访问基指针和返回地址,是否可以使用上述指针获取所需信息。

我能够使用返回地址和dladdr()函数提取函数名称。

我明白了GDB,所以应该可以提取这些信息?

c linux gdb bfd dladdr

6
推荐指数
1
解决办法
488
查看次数

LD_PRELOAD不适用于printf

我正在使用LD_PRELOAD来捕获linux中的write()系统调用.我成功地能够为写入系统调用执行此操作并使其工作.

但是,当我调用printf()时,它不起作用.如果我们使用strace观察printf堆栈跟踪,我发现,最后printf调用write()系统调用写入控制台,但那时我的write()系统调用在实际调用write()系统调用之前没有被调用.

任何人都知道为什么会这样?

linux system call interception

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

Linux中分配特定地址

我想在Linux进程中的特定地址分配一块内存。实际上我想做一些类似的事情:我将有多个进程。每个进程都会调用库(由我编写)中的初始化函数,该函数将在进程的地址空间中分配一些内存(它将存储进程相关信息)。这将由每个进程完成

一旦分配了该内存,程序就会调用库中的其他函数。现在这些函数想要访问第一个函数分配的内存(包含进程相关信息)。

问题是我无法存储库中进程地址空间中分配的内存的地址(甚至不能存储在静态指针中,因为有多个进程),而且我什至不希望用户程序存储该地址。我只是不想让用户程序知道库在其地址空间中分配了内存。库函数对他们来说是抽象的,他们只能使用它们。

有没有可能克服这个问题。我在想,每当任何进程调用分配内存的库的初始化函数时,内存总是在所有进程中分配在相同的地址(比如 10000),而不管其他所有事情。

因此任何想要访问该内存的库函数都可以轻松地通过以下方式完成: char *p=10000;

然后访问,访问的是调用库函数的进程的地址空间。

linux malloc virtual-memory

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

标签 统计

linux ×4

c ×2

bfd ×1

call ×1

dladdr ×1

gdb ×1

handlers ×1

interception ×1

malloc ×1

signals ×1

system ×1

virtual-memory ×1