Я не вижу такого поведения, в обоих случаях незаконный доступ вызывает вызов sighandler()
.
Конечно, это может быть вызвано тем, что Мне пришлось исправить пару проблем с вашим кодом (то, что вы предоставили, не скомпилировалось из коробки), в частности:
- создание файлов с разрешениями, которые позволяют мне открывать их снова, поскольку в противном случае они получают создано с нулевой маской разрешений:
fdout = open(FILE_NAME, O_CREAT| O_RDWR, 0777);
- Переназначение на основе исходного адреса, а не пока еще не существующего переназначенного адреса:
void *remap_addr = mremap(addr, 1024, 512, (MREMAP_FIXED | MREMAP_MAYMOVE), (void*)((unsigned long)addr + 4096) );
Как только эти проблемы были исправлены, незаконный доступ вызывал специальный обработчик независимо от того, был ли он до или после mremap
. Если это не решит вашу проблему, я предлагаю вам опубликовать свой фактический код, который вызывает проблему: -)
Еще одна вещь, которую вы, возможно, захотите рассмотреть, - это printf
является не одной из функций, которую можно безопасно вызывать из обработчиков сигналов. В этой ссылке подробно описано, что безопасно использовать, поэтому может быть вызвано проблемой внутри самого printf
.
Как Кроме того, было бы интересно посмотреть, что произойдет, если вы установите (или переустановите) обработчик сигналов после переназначения. Я упоминаю только это, потому что были и другие случаи, когда вызов определенных функций мешал тому, что изначально считалось отдельным элементом (смутное воспоминание о конфликте между sleep
и сигналом SIGALRM
, но это был long time a go).
Единственное, что я мог бы предложить, это использовать sigaction
для получения текущего расположения сигнала после вызова mremap
. Если он по какой-то причине был отсоединен от вашего обработчика, мы надеемся, что это должно прояснить это.