Может ли madvise(addr, size, MADV_DONTNEED) вызывать сбои сегментации?Linux

Anonymous
Может ли madvise(addr, size, MADV_DONTNEED) вызывать сбои сегментации?

Сообщение Anonymous »

Является ли madvise(*, *, MADV_DONTNEED) чисто рекомендательным? Я пробовал сканировать /proc/self/maps и вызывать на них madvise(addr, size, MADV_DONTNEED):

Код: Выделить всё

#include 
#include 

int main(void) {
FILE *fp;
char line[1024];

fp = fopen("/proc/self/maps", "r");
if (fp == NULL) {
perror("Failed to open maps file");
return 1;
}

while (fgets(line, sizeof(line), fp)) {
char addr[32], perms[8], offset[32], dev[32], inode[32], path[256];
unsigned long start, end;

path[0] = '\0';
sscanf(line, "%lx-%lx %s %s %s %s %[^\n]", &start, &end, perms, offset, dev, inode, path);

int ret = madvise((void*)start, end - start, MADV_DONTNEED);
if(ret == 0)
printf("  OK\n");
else
printf("  Error\n");
fflush(stdout);
}

fclose(fp);
}
Но это печатает:

Код: Выделить всё

  OK
OK
OK
OK
Segmentation fault
Есть ли простой способ определить (из /proc/self/maps, /proc/self/smaps или иначе), какие сегменты памяти принадлежат процессу разрешено ли вызывать madvise(*, *, MADV_DONTNEED)?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -segfaults

Вернуться в «Linux»