簡體   English   中英

bash 如何使用 CTRL+C 殺死子進程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM