[英]How is bash able to kill children processes with CTRL+C
我寫了一個簡單的程序如下 -
int main(int argc, char* argv[]) {
setuid(0);
setgid(0);
printf("Current uid and euid are %d, %d\n", getuid(), geteuid());
while(1);
}
我以 root 身份編譯它並使用sudo chmod +s test
設置 setuid 位。
當此程序以非特權用戶身份從 bash 運行時,程序打印 -
當前uid和euid分別為0、0
然后陷入無限循環。
但是我仍然可以通過按 Crl+C 來終止這個進程。 如果我理解正確,bash(以非特權用戶身份運行)不應該能夠將 SIGINT 發送到根進程。
我也用kill <pid of test>
嘗試了同樣的方法,但失敗了。
bash 是如何殺死進程的? 父進程和子進程之間有什么特殊的關系嗎?
我也試過這個其他包裝程序 -
int main(int argc, char* argv[]) {
pid_t p = fork();
if (p == 0) {
char * args[] = {"./test", NULL};
execv("./test", args);
} else {
sleep(4);
int ret = kill(p, 9);
printf("Kill returned = %d\n", ret);
return 0;
}
}
並以非特權用戶身份運行它(其中test
具有由 root 設置的 setuid 位)。 在這種情況下,父母無法殺死孩子。 kill
調用返回 -1 並且test
進程被孤立。
這里發生了什么? bash 有什么特別之處,它可以殺死它產生的子進程?
Bash 不需要任何權限,因為 bash 沒有做任何事情。 當您點擊 ^C 時,tty 驅動程序會將 SIGINT 發送到前台進程組中的所有進程。 該信號來自系統,而不是來自另一個進程,因此與一個進程向另一個進程發送信號相關的權限檢查不適用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.