2015-10-05 2 views
3

Я попытался запустить следующую команду kill -9 1, и он говорит bash: kill: (1) - Operation not permitted.SIGKILL init (PID = 1) без sudo? Ошибка в Linux?

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

Но при написании кода для c-shell я обнаружил ошибку (я думаю, что это действительно так). Я скомпилировал следующую программу и запустил ее. Теперь это смутило меня и все мои концепции ОС.

#include <signal.h> 
int main() 
{ 
    killpg(1,9); 
    return (0); 
} 

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

Может ли кто-нибудь дать мне повод и пояснить мое замешательство.

UPDATE
Man страница killpg() гласят ...

В Linux killpg() реализован в виде функции библиотеки, что делает умерщвление вызова (-pgrp, сиг).

Man страница kill() гласят ...

ПИД -1 специальный; он указывает все процессы, кроме самого процесса kill и init.

Вопрос теперь в том, какой смысл использовать такой вызов, который буквально убивает все. В нем много опасных приложений, а не полезных. Но все-таки, поскольку он хранится в ядре linux с тех пор, как много лет, он должен иметь свою собственную полезность. Но я не могу понять. Кто-нибудь знает что-нибудь об этом?

+1

'Если pgrp равно 0, killpg() отправляет сигнал в группу процессов вызывающего процесса . (POSIX говорит: если pgrp меньше или равно 1, поведение не определено. ' – Leandros

+0

Я пропустил эту строку на странице руководства. Это напоминает мне, что я должен дважды читать страницы человека, прежде чем что-то завершать. :) –

+0

Вы делаете не проверяйте вокруг как root, не так ли? – alk

ответ

6

На странице Linux для ручного killpg:

В Linux killpg() реализован в виде библиотечной функции, которая делает вызов kill(-pgrp, sig).

На странице Linux для ручного kill:

Если pid равен -1, то sig посылается каждому процессу, для которых вызывающий процесс имеет разрешение на передачу сигналов для процесса 1, за исключением (INIT)

Таким образом, вы работаете в частном случае, когда killpg(1, 9) фактически не значит послать SIGKILL к pgrp 1, но вместо этого он посылает SIGKILL ко всему, что имеет в связи с причудой реализации. Как указывали другие, POSIX не указывает поведение killpg, когда его первый аргумент равен 1, поэтому это, возможно, не ошибка.

+0

, но было бы лучше, если бы вы просто перекрестно проверили перед отправкой сигнала. Это предотвратит потерю системы, поскольку запуск кода ведет учетную запись пользователя. –

+0

@PinkeshBadjatiya Кто такой "ты"? – hobbs

+0

от «you» я имею в виду фактический код для системного вызова 'kill'. Я имею в виду, если мы проверим в самом коде и не допустим сигнализацию, если PID == 1, то это предотвратит сбой системы. –

3

От человека странице:

(POSIX говорит:. Если pgrp меньше или равна 1, то поведение не определено)

Таким образом, вы не можете зависеть от какой-либо конкретной если вы это сделаете.

Смежные вопросы