2015-03-17 2 views
2

Я хочу, чтобы не сбрасывать определенную информацию из моей программы в основной файл в случае любого сбоя.Избегайте сброса информации в основной файл

Для этого можно использовать coredump_filter (http://man7.org/linux/man-pages/man5/core.5.html)

Страница человек обеспечивает следующее описание

Значение в файле является битовой маской типов отображения памяти (см ММАП (2)). Если бит установлен в маске, то сопоставления памяти соответствующего типа сбрасываются; в противном случае они не сбрасываются. В битах в этом файле имеют следующие значения:

 bit 0 Dump anonymous private mappings. 
     bit 1 Dump anonymous shared mappings. 
     bit 2 Dump file-backed private mappings. 
     bit 3 Dump file-backed shared mappings. 
     bit 4 (since Linux 2.6.24) 
       Dump ELF headers. 
     bit 5 (since Linux 2.6.28) 
       Dump private huge pages. 
     bit 6 (since Linux 2.6.28) 
       Dump shared huge pages. 

Я ищу, чтобы узнать, какой бит для установки и сброса в моем случае. Я не совсем понимаю, что эти поля специально частные и общие.

У меня есть буфер (unsigned char *) в памяти. Я не хочу сбрасывать это в основной файл в случае любого сбоя. Есть ли какой-либо конкретный флаг, который я должен использовать для mmap? Пожалуйста помоги. Заранее спасибо.

+1

Ни один из этих бит не поможет вам отфильтровать ваш буфер специально. Например, они могут отфильтровать * всю * частную память, но тогда вы, вероятно, так же хорошо, как и не сбрасываете ядро. – Dolda2000

+0

Итак, вы имеете в виду, что нет способа фильтровать буфер, который нужно сбросить в основной файл. – ank

+0

Не использовать 'coredump_filter', по крайней мере, но это не значит, что это невозможно. У меня есть лидерство, о котором я напишу ответ. – Dolda2000

ответ

2

coredump_filter будет устанавливать только глобальные настройки процесса, поэтому он позволит вам только сбросить всю память или вообще нет.

Однако, есть флаг madvise, который, вероятно, делает что-то ближе к тому, что вы хотите: MADV_DONTDUMP. Он будет отмечать определенные страницы памяти, которые не отображаются в coredump. Однако ваша программа должна будет запускать madvise; вы не можете установить его извне процесса (за исключением использования gdb, я думаю).

Обратите внимание, что madvise действует только на целые страницы. Вы не можете установить флаг «эти 193 байта» или что-то не нужно сбрасывать. Если вы отметите страницу, на которой находится ваш буфер, остальная часть этой же страницы не будет сбрасываться. Если это проблема для вас, я думаю, вам нужно будет только mmap в вашем буфере вместо malloc, чтобы он остался один на странице.

+0

Полностью согласен с вами в том, что madvise можно использовать с флагом MADV_DONTDUMP. Однако этот параметр доступен с Linux 3.4. Я использую версию 2.6.32. Таким образом, мы не сможем использовать это решение. – ank

+0

@ank: Я не думаю, что есть другие варианты. Я думаю, кроме исправления вашего ядра 2.6.32 с кодом MADV_DONTDUMP. :) – Dolda2000