2015-10-05 22 views
3

我試着運行以下命令kill -9 1並且它說bash: kill: (1) - Operation not permittedSIGKILL init(PID = 1)沒有sudo?在Linux中的錯誤?

對我來說,很明顯你不應該能夠在沒有sudo的情況下發出init進程的信號。

但是,編寫c-shell的代碼時,我遇到了一個錯誤(我認爲它確實是)。我編譯了下面的程序並運行它。現在它讓我和我所有的操作系​​統概念感到困惑。

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

請保存所有的程序並運行自己的代碼。

任何人都可以給我一個理由,並澄清我的困惑。

UPDATE
killpg()讀作手冊頁...

在Linux上,killpg()實現爲庫函數,使 調用殺(-pgrp,SIG)。的kill()讀作

男子頁...

A的-1 PID是特殊的;它表示除kill 進程本身和init之外的所有進程。

現在的問題是,這樣的電話的用法是什麼,從字面上殺死所有的東西。它有許多危險的應用程序而不是有用的應用程序。但是,自從多年以來它一直被保存在Linux內核中以後,它一定有它自己的用處。但我無法弄清楚。有沒有人知道這件事?

+1

'如果pgrp爲0,killpg()將該信號發送到調用進程的進程組 。 (POSIX說:如果pgrp小於或等於1,則 的行爲是不確定的。' – Leandros

+0

我錯過了該手冊頁上的該行,這提醒我在結束任何事情之前,應該閱讀兩次手冊頁:) –

+0

不作爲根檢查,不是嗎? – alk

回答

6

在Linux手冊頁killpg

在Linux上,killpg()實現爲庫函數進行調用kill(-pgrp, sig)

在Linux手冊頁kill

如果pid等於-1,那麼sig被髮送到每一個爲調用進程有權限發送信號,除了處理1(init進程)

所以你正在運行到一個特殊的情況下,如果killpg(1, 9)事實上並不意味着送SIGKILL到PGRP 1,而是把它發送到SIGKILL它有一切許可,由於執行的怪癖。正如其他人指出的,POSIX在第一個參數爲1時沒有指定killpg的行爲,所以這可以說不是一個錯誤。

+0

但是如果您在發送信號之前進行交叉檢查,這不會更好嗎?這將防止系統受到影響,因爲運行代碼會註銷用戶帳戶。 –

+0

@PinkeshBadjatiya誰是「你」? – hobbs

+0

「你」我的意思是系統調用'kill'的實際代碼。我的意思是,如果我們在代碼本身進行驗證並且不允許在PID == 1的情況下發送信號,那麼這將防止系統崩潰。 –

3

從手冊頁:

(POSIX說:如果PGRP小於或等於1,則行爲是不確定的)

所以你不能依賴於任何特定的行爲,如果你這樣做。

相關問題