我已经编写了一个应用程序,我在linux中为不同的信号注册了信号处理程序的数量.在过程接收到信号后,控制转移到我已注册的信号处理程序.在这个信号处理程序中,我做了一些我需要做的工作,然后我想调用默认信号hander即SIF_DFL或SIG_IGN.然而,SIG_DFL和SIG_ING是两个宏分别扩展到数值0和1,它们是无效的函数的地址.
有什么方法我可以调用默认操作即SIG_DFL或SIG_IGN?
为了达到 SIG_DFL或者SIG_ING我调用exit(1)的效果而且什么都不做.但对于像SIGSEGV我这样的信号也希望有核心转储.一般来说,我希望我的默认行为与操作系统的操作方式SIG_DFL相同SIG_IGN,并忽略相同的行为.
是否可以在 C 程序中在运行时知道函数参数和变量的名称类型?例如,如果我有一个函数:
int abc(int x, float y , somestruct z ){
char a;
int b ;
}
Run Code Online (Sandbox Code Playgroud)
我可以知道在这个函数内部abc(),参数和变量的名称是什么,即在这种情况下它的x, y, z, a,b它们的类型是int, float, somestruct, char, int。
说是否还有另一个功能:
float some_func(specialstruct my_struct, int index){
}
Run Code Online (Sandbox Code Playgroud)
我应该知道参数 name 是my_struct,index类型是specialstruct, int。
我在运行时需要这些信息?
我可以访问基指针和返回地址,是否可以使用上述指针获取所需信息。
我能够使用返回地址和dladdr()函数提取函数名称。
我明白了GDB,所以应该可以提取这些信息?
我正在使用LD_PRELOAD来捕获linux中的write()系统调用.我成功地能够为写入系统调用执行此操作并使其工作.
但是,当我调用printf()时,它不起作用.如果我们使用strace观察printf堆栈跟踪,我发现,最后printf调用write()系统调用写入控制台,但那时我的write()系统调用在实际调用write()系统调用之前没有被调用.
任何人都知道为什么会这样?
我想在Linux进程中的特定地址分配一块内存。实际上我想做一些类似的事情:我将有多个进程。每个进程都会调用库(由我编写)中的初始化函数,该函数将在进程的地址空间中分配一些内存(它将存储进程相关信息)。这将由每个进程完成
一旦分配了该内存,程序就会调用库中的其他函数。现在这些函数想要访问第一个函数分配的内存(包含进程相关信息)。
问题是我无法存储库中进程地址空间中分配的内存的地址(甚至不能存储在静态指针中,因为有多个进程),而且我什至不希望用户程序存储该地址。我只是不想让用户程序知道库在其地址空间中分配了内存。库函数对他们来说是抽象的,他们只能使用它们。
有没有可能克服这个问题。我在想,每当任何进程调用分配内存的库的初始化函数时,内存总是在所有进程中分配在相同的地址(比如 10000),而不管其他所有事情。
因此任何想要访问该内存的库函数都可以轻松地通过以下方式完成:
char *p=10000;
然后访问,访问的是调用库函数的进程的地址空间。