Để trả lời câu hỏi thứ hai của bạn trước: SIGSTOP
và SIGKILL
ứng dụng không thể bị bắt, nhưng mọi tín hiệu khác đều có thể, thậm chí SIGSEGV
. Thuộc tính này hữu ích cho việc gỡ lỗi - ví dụ, với sự hỗ trợ của thư viện phù hợp, bạn có thể lắng nghe SIGSEGV
và tạo một backtrace ngăn xếp để hiển thị nơi xảy ra lỗi segfault đó.
Từ chính thức (đối với Linux, dù sao) về những gì từng tín hiệu có sẵn bằng cách nhập man 7 signal
từ một dòng lệnh Linux. http://linux.die.net/man/7/signal có cùng thông tin, nhưng các bảng khó đọc hơn.
Tuy nhiên, không có một số kinh nghiệm về tín hiệu, thật khó để biết từ những mô tả ngắn về những gì họ làm trong thực tế, vì vậy đây là cách giải thích của tôi:
Kích hoạt từ bàn phím
SIGINT
xảy ra khi bạn nhấn CTRL+C
.
SIGQUIT
được kích hoạt bởi CTRL+\
, và bãi bỏ lõi.
SIGTSTP
đình chỉ chương trình của bạn khi bạn nhấn CTRL+Z
. Không giống như SIGSTOP
, nó có thể bắt được, điều này mang lại cho các chương trình như vi
cơ hội đặt lại thiết bị đầu cuối về trạng thái an toàn trước khi tạm dừng.
Tương tác đầu cuối
SIGHUP
("Hangup") là những gì xảy ra khi bạn đóng xterm của bạn (hoặc nếu không thì ngắt kết nối thiết bị đầu cuối) trong khi chương trình của bạn đang chạy.
SIGTTIN
và SIGTTOU
tạm dừng chương trình của bạn nếu nó cố đọc hoặc ghi vào thiết bị đầu cuối trong khi nó đang chạy ẩn. Để SIGTTOU
xảy ra, tôi nghĩ rằng chương trình cần phải được viết /dev/tty
, không chỉ là thiết bị xuất chuẩn mặc định.
Kích hoạt bởi một ngoại lệ CPU
Điều này có nghĩa là chương trình của bạn đã cố gắng làm điều gì đó sai.
SIGILL
có nghĩa là một hướng dẫn bộ xử lý bất hợp pháp hoặc không xác định. Điều này có thể xảy ra nếu bạn cố truy cập trực tiếp vào cổng I / O của bộ xử lý.
SIGFPE
có nghĩa là đã có một lỗi toán học phần cứng; rất có thể chương trình đã cố gắng chia cho số không.
SIGSEGV
có nghĩa là chương trình của bạn đã cố gắng truy cập vào một vùng bộ nhớ chưa được khai thác.
SIGBUS
có nghĩa là chương trình truy cập bộ nhớ không chính xác theo một cách khác; Tôi sẽ không đi vào chi tiết cho bản tóm tắt này.
Quá trình tương tác
SIGPIPE
xảy ra nếu bạn cố gắng ghi vào một đường ống sau khi đầu đọc của ống đóng lại. Xem man 7 pipe
.
SIGCHLD
xảy ra khi một tiến trình con bạn tạo hoặc thoát hoặc bị đình chỉ (bởi SIGSTOP
hoặc tương tự).
Hữu ích cho việc tự báo hiệu
SIGABRT
thường được gây ra bởi chương trình gọi abort()
hàm và gây ra kết xuất lõi theo mặc định. Sắp xếp một "nút hoảng loạn".
SIGALRM
được gây ra bởi lệnh alarm()
gọi hệ thống, điều này sẽ khiến kernel phân phối a SIGALRM
đến chương trình sau một số giây được chỉ định. Xem man 2 alarm
và man 2 sleep
.
SIGUSR1
và SIGUSR2
được sử dụng tuy nhiên chương trình thích. Chúng có thể hữu ích cho tín hiệu giữa các quá trình.
Gửi bởi quản trị viên
Các tín hiệu này thường được gửi từ dấu nhắc lệnh, thông qua kill
lệnh fg
hoặc bg
trong trường hợp SIGCONT
.
SIGKILL
và SIGSTOP
là những tín hiệu không thể chặn được. Việc đầu tiên luôn chấm dứt quá trình ngay lập tức; thứ hai đình chỉ quá trình.
SIGCONT
nối lại một quá trình bị đình chỉ.
SIGTERM
là một phiên bản có thể bắt được của SIGKILL
.