Это (несколько) не определено.
Если процесс получения настраивается для принятия мер по получении сигнала (то есть, сигнал не проигнорирован или заблокирован, то процесс становится выполнимым. Если это будет иметь достаточный приоритет, то это также сразу планируется, но это не гарантируется.
Конечно, это не разрушит ядро, Вы пишете в пространство виртуальной памяти своей собственной программы, не real
пространство памяти ядра.
Узнайте больше о виртуальной памяти здесь
P.S.:
Почему printf
ничего не печатает? Стандартным выводом по умолчанию с буфером строки, и Ваш hello world
не содержит разделитель строки.
Таким образом, если разрушенная программа, Вы не заметите, что производит (Попробуйте использование puts
или добавление a \n
в Вашем сообщении)
Понятно, без sudo, запуская программу оказывается отказом сегментов. Я НИЧЕГО не получил, когда выполняют его через sudo./a.out!
Вы уверены, что это работало вообще?
#include <stdio.h>
int main (void) {
fprintf(stderr,"Attempting out-of-bounds access.\n");
int *p = (int*)0xffff000000000000;
fprintf(stderr,"%d\n", *p);
*p = 666;
fprintf(stderr,"%d\n", *p);
return 0;
}
Это использование stderr
, так как это не буферизуется, для предотвращения проблем, описанных warl0ck.
me@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault
me@home> su root
Password:
root@home> ./a.out
Attempting out-of-bounds access.
Segmentation fault
Точно, что должно произойти. Система никогда не будет позволять никому сделать это. Эта строка:
int *p = (int*)0xffff000000000000;
При компиляции и выполнении получает SIGSEGV, иначе. "отказ сегментации".