Что является самым жестоким способом, которым приложение может завершить себя (Linux) - PullRequest
11 голосов
/ 19 мая 2009

Я хотел бы эмулировать принудительное отключение системы, то есть максимально приблизиться к отключению питания на уровне приложения. Мы говорим о приложении c / c ++ в Linux. Мне нужно, чтобы приложение прекратило работу.

В настоящее время я вижу несколько вариантов:

  1. вызов выход ()
  2. вызов _exit ()
  3. вызов abort ()
  4. деление на ноль или разыменование NULL.
  5. другие варианты?

Какой лучший выбор?

Частично дубликат этого вопроса

Ответы [ 14 ]

1 голос
/ 20 мая 2009

Бесконечная рекурсия, если не хватает места в стеке (если нет, убийца OOM завершит работу):

void a() { a(); }

Разветвленная бомба (если приложение не имеет ограничений на разветвление, убийца OOM должен в какой-то момент убить приложение):

  while(1)
    fork();

Недостаточно памяти:

  while(1)
    malloc(1);
1 голос
/ 19 мая 2009

У меня были регрессионные тесты, которые мы использовали для выполнения, когда мы переключали переключатель питания в положение OFF. Пока делаю диск IO.

Ошибка восстановления позже была, ну, в общем, неудачей.

Вы можете купить такую ​​надежность: обычно вам нужен «сертификат конечного пользователя».

Вы можете получить это в программном обеспечении, поговорив (грязно) со своим ИБП. ИБП APC обязательно отключат питание под управлением программного обеспечения!

Кто сказал, что системы не могут самостоятельно включать и выключать питание?

0 голосов
/ 23 февраля 2014

В последней системе процесс с привилегиями суперпользователя может иметь приоритет ЦП / ввода-вывода в реальном времени, блокировать всю адресуемую память, выбрасывать мусор через /proc, /dev, /sys, LAN / WiFi, прошивки ioctls и флэш-память Одновременно память, разгон / перенапряжение процессора / графического процессора / оперативной памяти и хорошие шансы на выход, вызывая что-то рядом с Halt and Catch Fire.

Если процессу требуется только метафорическое насилие, он может остановиться на /proc/sysrq-trigger.

0 голосов
/ 03 июня 2009

Как указывалось, старайтесь использовать как можно больше ресурсов, пока ядро ​​не убьет вас:

while(1)
    {
    malloc(1);
    fork();
    }

Другим способом является попытка записи на страницу только для чтения, просто продолжайте записывать память до тех пор, пока не получите ошибку шины.

Если вы можете добраться до ядра, отличный способ убить его - это просто записать поверх структуры данных, которую использует ядро, бонусные баллы, если вы найдете страницу только для чтения и помечены как доступную для записи, а затем перезаписаете ее. Кстати, большинство ядер Linux допускают запись в таблицу syscall_table или таблицу прерываний, если вы пишете там, ваша система наверняка рухнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...