2012-01-06 43 views
17

Chức năng kill trong Linux có đồng bộ không? Nói, tôi lập trình gọi hàm kill để chấm dứt một quá trình, nó sẽ trở lại chỉ khi quá trình dự định được chấm dứt, hoặc nó chỉ gửi tín hiệu và trả về. Nếu đó là trường hợp, làm thế nào tôi có thể làm cho nó chờ đợi cho quá trình dự định sẽ bị giết?Chức năng giết có đồng bộ không?

+2

Giai thoại, tôi có thể nói không, vì tôi đã sử dụng 'kill' trên một quá trình, để nó trở lại và có quá trình vẫn còn hiện diện. Sau đó phải làm một 'kill -9'. –

+1

Lưu ý: không phải tất cả các tín hiệu bạn có thể gửi đến một quá trình * sẽ * chấm dứt nó - ngay cả một 'kill 1234' (sử dụng' SIGTERM') có thể bị bẫy và bỏ qua. Cách duy nhất để giết vô điều kiện là sử dụng 'kill -9', khá tàn bạo (không có cơ hội để dọn dẹp). – Piskvor

+1

Thậm chí không có 'kill -9' luôn giết chết nó ngay lập tức, vì có một số trạng thái (cụ thể là trạng thái" D ") trong đó nó sẽ không chết cho đến khi chuỗi hạt nhân được gắn với kết thúc. –

Trả lời

18

Không, vì nó không giết bất cứ thứ gì, nó chỉ gửi tín hiệu đến quy trình.

Theo mặc định, tín hiệu này thậm chí có thể bị chặn hoặc bỏ qua.

Bạn không thể chặn kill -9 mà đại diện cho gửi SIGKILL

Để chờ cho quá trình này phải chết:

while kill -0 PID_OF_THE_PROCESS 2>/dev/null; do sleep 1; done 
+0

+1 để hiển thị một phương pháp chờ đợi đơn giản cho đến khi pid biến mất. –

+0

SIGKILL không thể bị chặn hoặc bỏ qua bởi một quá trình. Nhưng bạn nói đúng là quá trình đó sẽ không chấm dứt ngay lập tức. Nếu một tiến trình đang thực hiện một cuộc gọi hệ thống, nó sẽ chỉ kết thúc khi hệ thống gọi lại. Vì vậy, nếu nó thực hiện một số xử lý nặng thực sự, nó có thể mất thời gian. – ugoren

+1

Nó cũng sẽ từ chối chết nếu nó ở trạng thái 'UNINTERRUPTIBLE' –

3

Hệ thống kill cuộc gọi không chờ đợi cho quá trình khác để làm bất cứ điều gì. Tín hiệu được đăng lên quá trình đích và hệ thống trả về cuộc gọi. Quá trình nhắm mục tiêu thông báo tín hiệu khi nó được lên lịch để chạy.

4

kill không thể đồng bộ vì nó chỉ gửi tín hiệu. Quá trình nhắm mục tiêu có thể bỏ qua các tín hiệu đến (xem SIG_IGN) vì vậy không có bảo đảm nào liên quan đến hiệu lực của kill.

Sẽ không khó để thử nghiệm xác minh giả thuyết này. Bắt đầu quá trình A và làm cho nó xử lý SIGTERM với một giấc ngủ 10 giây trước khi chết. Sau đó bắt đầu quá trình B, cung cấp một số SIGTERM đến A và thoát ngay lập tức.

3
  1. số man 2 kill
  2. man wait

Xem thêm man 7 signal để biết thêm chi tiết về tín hiệu Unix.

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