char *ptr = (char*) malloc(40);
printf("%u",ptr);
56737856 (some output)
Run Code Online (Sandbox Code Playgroud)
现在,如果我不正确,我们上面看到的输出不是物理地址,而是来自虚拟地址空间.我对么?
有没有办法看到实际的实际地址?反之亦然(如果我的上述假设是错误的),并且malloc的所有内部实现都必须使用jemalloc算法吗?
我有重载的功能,如:
void f(int)
void f(int, int)
void f(int, float)
Run Code Online (Sandbox Code Playgroud)
如何编译它,以便我可以看到错位的输出?就像是:
void f(int) should show: ?f@@YAXH@Z(int)
Run Code Online (Sandbox Code Playgroud)
例如,要查看我们使用的预处理器输出-E,汇编器输出-s,它是什么名称错位输出?
PS:平台是Linux
编辑:
通过这里的答案我们去:
void func(int);
void func(int, int);
void func(void);
void func(char);
[root@localhost ~]# cat a.map | grep func
0x0804881a _Z4funcc
0x08048790 _Z4funcv
0x080487be _Z4funcii
0x080487ec _Z4funci
Run Code Online (Sandbox Code Playgroud) 我已经重载了fork()系统调用并fork()使用RTLD_NEXT 创建了我自己的版本.就是这样dlsym(RTLD_NEXT, fork).这将打到我的版本的fork.在此之后,我想复制实际fork()系统调用的任务,即创建子进程并返回pid,以及一些更多的附加功能.
我无法弄清楚如何做到这一点.我检查了fork()(fork.c)的内核源代码并且无法弄清楚.
这样做:
dlsym(RTLD_NEXT,fork);
int fork(void) {
int pid=_fork(); // Trying to call actual fork does not work
return pid;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这是fork的内核源代码的链接:http://lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10
编辑(从评论中提取):
我正在研究泄漏检测工具,当子进程删除父进程分配的内存时,此工具会检测到double free.为了克服这一点,我将覆盖fork(),并且只要有a fork(),父进程的内存分配表将被复制到子进程.
我写了一小段代码.此代码首先阻塞{SIGSEGV},然后将SIGRTMIN添加到同一个集合中.所以,我的最终信号集是{SIGSEGV,SIGRTMIN}.因此,如果我使用SIG_UNBLOCK,根据我的理解,第一个SIGRTMIN应该被解除阻塞,然后如果我调用SIG_UNBLOCK,则应该取消阻塞SIGSEGV.
即,1){SIGSEGV,SIGRTMIN} 2)SIG_UNBLOCK = unblock SIGRTMIN,3)再次调用SIG_UNBLOCK = unblock SIGSEGV.我只给了进程一个SIGRTMIN,因此我的第二个unblock应该用SIGRTMIN暂停进程.但事实并非如此.请帮忙. 注意:请不要给sigprocmask()上的其他问题的答案链接,我已经看过他们,他们没有澄清我的问题.
enter code here
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
sigset_t old_set,new_set;
sigemptyset(&old_set);
sigemptyset(&new_set);
if(sigaddset(&old_set,SIGSEGV)==0)
{
printf("sigaddset successfully added for SIGSEGV\n");
}
sigprocmask(SIG_BLOCK,&old_set,NULL); // SIGSEGV signal is masked
kill(0,SIGSEGV);
//*****************************************************************
if(sigaddset(&new_set,SIGRTMIN)==0)
{
printf("sigaddset successfully added for SIGRTMIN\n");
}
sigprocmask(SIG_BLOCK,&new_set,&old_set); // SIGRTMIN signal is masked
kill(0,SIGSEGV);
//****************** Unblock one signal at a time ******************
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGRTMIN signal is unmasked
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGSEGV signal is unmasked
Run Code Online (Sandbox Code Playgroud)
}
Output:
[root@dhcppc0 …Run Code Online (Sandbox Code Playgroud) 我使用strtod()函数将环境变量提取为字符串,然后使用strtod将其更改为double:
enter code here
char strEnv[32];
strncpy(strEnv, getenv("LT_LEAK_START"), 31);
// How to make sure before parsing that env LT_LEAK_START is indeed a number?
double d = strtod(strEnv, NULL);
Run Code Online (Sandbox Code Playgroud)
现在我想确保用户输入的这个数字是一个数字而不是字符串或特殊字符.我怎样才能确定?
代码片段会有很大帮助.
提前致谢.
我在Linux中写了一个C程序来设置环境变量的使用值setenv,但执行后,当我运行set或者export,环境变量本身似乎被取消设置.为什么?
这是代码片段:
int main()
{
char *mallocPtr, *callocPtr, *reallocPtr, *memalignPtr, *vallocPtr;
struct sigaction sa;
sa.sa_handler=SIGSEGV_handler;
sigaction(SIGSEGV, &sa, NULL);
if(setenv("ENV1", "3", 1) == 0)
printf("ENV1 set to 3\n");
else
fprintf(stderr, "setenv failed on ENV1");
Run Code Online (Sandbox Code Playgroud) 我已经使用timer_create()API实现了一个POSIX计时器,这将在计时器到期时生成SIGUSR1,我已经为其添加了处理程序代码.现在的问题是,如果这个程序收到另一个SIGUSR1,那么将调用并捕获相同的信号处理程序.
有没有办法防止这种情况,以便处理程序可以捕获仅由计时器生成的信号?
我可以看到-prune find无法正常工作.我猜-name "efence*" -prune选项应该选择(或找到)除了名称efence*正确的文件之外的所有文件?
或者我的理解是错的?
我执行的命令:
find * -maxdepth 0 -name "efence*" -prune
期望:选择当前目录(maxdepth 0)中的所有文件,但名称为*efence的文件除外.
请帮我理解 -prune
我在我的代码中放了一个简单的信号处理程序.我初始化了sigevent结构,使用处理函数来捕获信号.
有人可以指出为什么代码不工作?理想情况下,如果有信号,我的处理程序应该被调用.但事实并非如此.
请帮帮我,谢谢Kingsmasher1
enter code here
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sival_int, void* sival_ptr)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
struct sigevent sevp;
sevp.sigev_notify=SIGEV_THREAD;
sevp.sigev_signo=SIGRTMIN;
sevp.sigev_value.sival_ptr=NULL;
sevp.sigev_notify_function=(void*)my_handler;
kill(0,SIGRTMIN); // This should invoke the signal and call the function
}
Run Code Online (Sandbox Code Playgroud) 我正在使用保险丝实现虚拟文件系统,并且需要对 readdir 中的偏移参数有所了解。
早些时候我们忽略了偏移量并在填充函数中传递了 0,在这种情况下内核应该注意。
我们的文件系统数据库存储:目录名称、文件长度、inode 编号和父 inode 编号。
我如何计算得到偏移量?
那么每个组件的偏移量是否等于它们的大小以它们的 inode 编号的增量形式排序?如果目录中有一个目录会发生什么,这种情况下的偏移量是否等于内部文件的总和?
Example: in case the dir listing is - a.txt b.txt c.txt
And inode number of a.txt=3, b.txt=5, c.txt=7
Offset of a.txt= directory offset
Offset of b.txt=dir offset + size of a.txt
Offset of c.txt=dir offset + size of b.txt
Run Code Online (Sandbox Code Playgroud)
上述假设是否正确?
PS:这里是fuse的回调