Tại sao gõ Ctrl + c hai lần sẽ dừng quá trình chạy trong Linux?


24

Có các chương trình Linux, ví dụ như vlc, khuyên bạn nên gõ ctrl+ chai lần để giết sự thực thi của chúng từ một thiết bị đầu cuối nếu chương trình không dừng sau lần đầu tiên.

Tại sao gõ ctrl+ chai lần hoạt động khi lần đầu tiên không hoạt động?


6
[cần dẫn nguồn]
Ignacio Vazquez-Abrams

Câu trả lời:


35

Những gì nó làm là hoàn toàn ứng dụng cụ thể. Khi bạn nhấn ctrl+ c, trình giả lập thiết bị đầu cuối sẽ gửi tín hiệu SIGINT đến ứng dụng nền trước, kích hoạt "trình xử lý tín hiệu" thích hợp. Trình xử lý tín hiệu mặc định cho SIGINT chấm dứt ứng dụng. Nhưng bất kỳ chương trình nào cũng có thể cài đặt trình xử lý tín hiệu riêng cho SIGINT (bao gồm cả trình xử lý tín hiệu hoàn toàn không dừng thực thi).

Rõ ràng, vlc cài đặt một trình xử lý tín hiệu cố gắng thực hiện một số kết thúc dọn dẹp / kết thúc duyên dáng ngay lần đầu tiên được gọi và quay trở lại hành vi mặc định của việc thực thi ngay lập tức khi nó được gọi lần thứ hai.


3
Trên một số hệ thống, tín hiệu được hoàn nguyên về SIG_DFL sau khi gọi trình xử lý (để tránh gọi trình xử lý hai lần trên cùng một tín hiệu); đây được gọi là ngữ nghĩa SysV. Nhiều chương trình không đặt trình xử lý tín hiệu trở về cài đặt gốc của chương trình ở cuối trình xử lý. Điều này thường sẽ là một lỗi lập trình. Đọc thêm thông tin về tín hiệu (2) manpage .
Arcege

16

SIGINT , tín hiệu được gửi bởi Ctrl+ C, theo quy ước sẽ cho một chương trình thoát ra khỏi vòng xử lý lệnh chính của nó hoặc nếu điều đó không có ý nghĩa, hãy thoát ra một cách sạch sẽ. Một số chương trình chạy quy trình dọn dẹp khi chúng nhận được SIGINT. Nếu chương trình như vậy là sai lầm rằng các thủ tục dọn dẹp thất bại, trong một số chương trình, một giây Ctrl+ Clàm cho chương trình bỏ ngay lập tức. Làm điều này là tùy thuộc vào mỗi tác giả chương trình.

Nếu một giây Ctrl+ Ckhông giết chết chương trình, hãy thử Ctrl+ \, gửi SIGQUIT , một (tín hiệu nhưng vẫn catchable) dữ dội hơn, hoặc thử Ctrl+ Zđể đình chỉ các chương trình và sau đó là killlệnh (ví dụ kill %1mà gửi SIGTERM , một tín hiệu thông thường ít bạo lực hơn SIGQUIT, đến công việc số 1). Nếu vẫn thất bại, hãy hủy chương trình với kill -KILL, còn được gọi là kill -9, gửi tín hiệu không thể so sánh SIGKILL .

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.