2011-06-21 63 views
5

Quy trình xử lý tín hiệu trong python là gì? Tôi thiết lập một xử lý tín hiệu, khi tín hiệu xảy ra, làm thế nào để python gọi chức năng của tôi? Hệ điều hành có gọi nó giống như chương trình C không? Nếu tôi đang ở trong một mở rộng của python, nó bị gián đoạn ngay lập tức?python xử lý tín hiệu như thế nào?


Bây giờ, rõ ràng với tôi quá trình python xử lý tín hiệu như thế nào. Khi bạn thiết lập tín hiệu bằng mô-đun tín hiệu, mô-đun sẽ đăng ký chức năng signal_handler (xem $ src/Modules/signalmodule.c), đặt trình xử lý của bạn và gắn cờ là 1 (Handlers[sig_num].tripped = 1;), sau đó gọi Py_AddPendingCall để thông báo cho trình thông dịch python. Trình thông dịch python sẽ gọi Py_MakePendingCalls để gọi PyErr_CheckSignals gọi hàm của bạn trong vòng lặp chính (xem $ src/Python/ceval.c). liên lạc với tôi nếu bạn muốn nói về điều này: [email protected]

Trả lời

6

Nếu bạn đặt trình xử lý tín hiệu mã Python bằng mô-đun tín hiệu, trình thông dịch sẽ chỉ chạy nó khi nó nhập lại trình thông dịch mã byte. Trình xử lý không chạy ngay lập tức. Nó được đặt trong hàng đợi khi tín hiệu xảy ra. Nếu đường dẫn mã hiện đang trong mã C, mô-đun gắn sẵn hoặc mở rộng, trình xử lý được hoãn lại cho đến khi mã C trả về điều khiển cho trình thông dịch mã byte Python. Điều này có thể là một thời gian dài, và bạn thực sự không thể dự đoán được bao lâu.

Đáng chú ý nhất là nếu bạn đang sử dụng chế độ tương tác với đường dây hỗ trợ, trình xử lý tín hiệu của bạn sẽ không chạy cho đến khi bạn cung cấp cho một số đầu vào để diễn giải. điều này là do mã đầu vào nằm trong thư viện readline (mã C) và không trở lại trình thông dịch cho đến khi nó có một dòng hoàn chỉnh.

+0

Vì vậy, trình thông dịch trăn xử lý tín hiệu và gọi hàm của tôi. Tôi muốn biết điều này xảy ra như thế nào. Tôi đọc ignalmodule.c, funcs python được nối vào một mảng, và PyErr_CheckSignals gọi hàm được bắn. Tuy nhiên, PyErr_CheckSginals được gọi khi tín hiệu được gửi bởi hệ điều hành ở đâu? – renenglish

+0

Nó không được gọi khi một tín hiệu được gửi bởi hệ điều hành. Nó được gọi rõ ràng ở những nơi khác nhau trong trình thông dịch khi bộ xử lý tín hiệu có thể chạy, chẳng hạn như khi in, đọc đầu vào của người dùng, vv Nó chạy hàng đợi xử lý ngắt. – Keith

+0

Thx rất nhiều! Bây giờ nó rõ ràng với tôi như thế nào quá trình python xử lý một tín hiệu. Khi bạn thiết lập tín hiệu bằng mô-đun tín hiệu, mô-đun sẽ đăng ký chức năng signal_handler (xem $ src/Modules/signalmodule.c), thiết lập trình xử lý của bạn và gắn cờ nó là 1 (Trình xử lý [sig_num] .tripped = 1;), sau đó gọi Py_AddPendingCall để thông báo cho trình thông dịch python. Trình thông dịch python sẽ gọi Py_MakePendingCalls để gọi PyErr_CheckSignals gọi hàm của bạn trong vòng lặp thư (xem $ src/Python/ceval.c). – renenglish

0

Hãy xem signal module. Nếu bạn gọi một tín hiệu đến một kịch bản python, từ sự hiểu biết của tôi nếu có một trình xử lý cho nó đầu tiên sẽ xử lý tín hiệu đó, và có khả năng xử lý và bỏ qua các tín hiệu nhất định. I E. thay vì giết trên SIGKILL, bạn cố gắng thực hiện một số công việc dọn dẹp trước khi giết.

Các vấn đề liên quan