我必须创建一个程序,将int
数组与mmap()
分配,然后计算实际分配给它的内存量。
到目前为止,我有分配数组的代码,但我不知道如何计算分配的内存。这是我到目前为止所尝试的:
处理程序:
int i;
void segfault_sigaction(int signal, siginfo_t *si, void *arg)
{
printf("ujel segafult, velikost pomnilnika je: %d bajtov\n", sizeof(int) * i);
exit(0);
}
主要:
int main(int argc, char* argv[])
{
int *addr;
int n = atoi(argv[1]);
struct sigaction sa;
memset(&sa,0,sizeof(sigaction));
sa.sa_handler = segfault_sigaction;
//sigemptyset(&sa.sa_mask);
//sa.sa_sigaction = segfault_sigaction;
//sa.sa_flags = 0;
sigaction(SIGSEGV,&sa, NULL);
addr = mmap(NULL, n * sizeof(int), PROT_WRITE | PROT_READ ,MAP_ANONYMOUS | MAP_PRIVATE,-1,0);
i = n;
while(1){
addr[i+1] = 5;
i++;
}
return 0;
}
编辑:在再次阅读你的答案和任务描述之后,我改变了代码,我输入了一个捕获SEGFAULT的处理程序,但它不是真的可靠(有时它可以工作,有时会出现默认的分段错误错误)。
答案 0 :(得分:4)
由mmap()
映射的内存量正是您所请求的内存量,可能会稍微向上舍入。如果你问,“我怎么能看到它被围捕了多少”,答案是你不能以一般的方式这样做,但是一些特定的平台可能有API让你弄明白。但是没有理由你需要。
您编写的代码似乎是通过查找非零部分来“搜索”分配的结尾。这会导致未定义的行为,因为您将始终在分配结束时运行。你绝对不能这样做。只需使用传递给mmap()
的大小作为大小。这是唯一重要的尺寸。