Làm thế nào các trình giả lập thiết bị đầu cuối có thể giết chết con cái của họ sau khi nhận được một SIGKILL?


12

Từ những gì tôi hiểu, SIGKILL không thể bị bắt. Điều này có nghĩa là một quá trình không có thời gian để giết chết trẻ em trước khi HĐH phá hủy nó. Điều này có thể được chứng minh với một kịch bản shell.

#! /bin/bash

trap : SIGTERM SIGINT SIGKILL # SIGKILL is pointless.

mplayer video.avi

Giết nó bằng SIGKILL khiến mplayer chạy.

$ kill -9 $pid

Nhưng khi sử dụng trình giả lập thiết bị đầu cuối (xterm, Terminal, ...), trẻ em sẽ bị giết cùng với nó. Sao có thể như thế được?

$ mplayer

Và giết nó:

$ kill -9 $terminal_pid

Và mplayer đi xuống với con tàu. Các trình giả lập thiết bị đầu cuối bằng cách nào đó bắt SIGKILL hoặc có một lực lượng khác đang làm việc ở đây?

Câu trả lời:


11

Quá trình bắt đầu bởi xtermsẽ là người lãnh đạo phiên kiểm soát thiết bị đầu cuối.

Khi thiết bị đầu cuối biến mất, quá trình đó sẽ tự động nhận được tín hiệu SIGHUP (theo sau là SIGCONT). Điều này được gửi bởi kernel theo cách tương tự như các quá trình nhận SIGINT khi bạn nhấn CTRL-C.

Ngoài ra, hệ vỏ có thể gửi SIGHUP cho một số con của nó khi thoát (xem disowntrong một số vỏ để vô hiệu hóa điều đó)


1
Để biết thông tin về các phiên và các nhà lãnh đạo phiên: unix.stackexchange.com/questions/18166/ .
Kevin Cox

+1 disownrất hữu ích.
toán

1

Câu hỏi của bạn tự trả lời, điều này xảy ra bởi vì các quy trình này đang chạy như là trẻ em dưới trình giả lập thiết bị đầu cuối. Vì vậy, bạn giết trình giả lập thiết bị đầu cuối, và khi làm như vậy, giết tất cả các tiến trình con (vì các con đang chạy trong cùng nhóm quy trình với trình giả lập thiết bị đầu cuối điều khiển).

Xem, ví dụ, như sau:

csb@darwin[~]$ ps fauwx | grep -A6 "xfce4-terminal" | awk '{ for (i = 2; i <= 9; i++) $i="" ; print $0 }' 
csb         0:32 xfce4-terminal --geometry=271x65 --display :0.0 --role=Terminal-0x1340050-2606-1351620352 --show-menubar --show-borders --hide-toolbars --working-directory /home/csb --tab --working-directory /home/csb
csb         0:00 \_ gnome-pty-helper
csb         0:00 \_ bash
csb         0:00 | 
                  \_ ssh [redacted]
csb         0:00 \_ bash
csb         0:00 \_ ps fauwx
csb         0:00 \_ grep --color=auto -A6 xfce4-terminal
csb         0:00 \_ awk { for (i = 2; i <= 9; i++) $i="" ; print $0 }

Tất cả các quy trình này đang chạy trong các quy trình 'xfce4-terminal', vì vậy nếu tôi giết quy trình đó thì nó sẽ tự động giết tất cả các quy trình con trong nhóm quy trình ... ví dụ như cách thoát khỏi cửa sổ giả lập thiết bị đầu cuối sẽ nhất thiết phải hủy kết nối SSH của tôi.

Các chương trình như shell tạo ra các nhóm quy trình mới, thường đặt các tiến trình con liên quan vào một nhóm. Mỗi công việc là một nhóm quy trình. Bên ngoài kernel, shell điều khiển một công việc bằng cách gửi tín hiệu đến nhóm quy trình của công việc bằng lệnh gọi hệ thống killpg, cung cấp tín hiệu cho tất cả các quy trình trong một nhóm quy trình.


3
-1: Giết cha mẹ không khiến con cái bị giết.
camh

2
Các chương trình như shell tạo ra các nhóm quy trình mới, thường đặt các tiến trình con liên quan vào một nhóm. Mỗi công việc là một nhóm quy trình. Bên ngoài kernel, shell điều khiển một công việc bằng cách gửi tín hiệu đến nhóm quy trình của công việc bằng lệnh gọi hệ thống killpg, cung cấp tín hiệu cho tất cả các quy trình trong một nhóm quy trình.
Charles Boyd

2
@CharlesBoyd Nhận xét đó nên là một phần trong câu trả lời của bạn.
jordanm

4
@CharlesBoyd: Thêm câu đó vào câu trả lời của bạn và tôi sẽ cho bạn +1 thay vì -1. Câu trả lời của bạn hiện đang đọc như thể các tiến trình con bị giết khi tiến trình cha bị giết (BTW, dựa trên phiên, không dựa trên quy trình theo nhóm).
camh

@CharlesBoyd Tôi hiểu điều đó, nhưng vấn đề của câu hỏi là làm thế nào nó "thao túng [] một công việc bằng cách gửi tín hiệu" khi nhận được SIGKILL. Tôi thấy không có cách nào để nó sử dụng killpgcuộc gọi hệ thống tại thời điểm đó.
Kevin Cox

0

Đầu tiên, tôi không thể tái tạo người chơi còn sống sót sau khi thiết bị đầu cuối bị giết, sử dụng xterm.

Lý do nó chết, là nó nhận được SIGHUP từ cái chết của cha mẹ.


Tôi chưa bao giờ nói nó đã làm, tôi nói rằng nó chết nhưng vẫn sống sót khi nó nằm trong một kịch bản và nó đã bị giết.
Kevin Cox

Không tồn tại trong một kịch bản, đối với tôi.
tumbleweed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.