Làm thế nào để giết một luồng riêng lẻ theo một quy trình trong linux?


13

nhập mô tả hình ảnh ở đây

Đây là các luồng riêng lẻ của quá trình nhận gói. Có cách nào để giết bất kỳ chủ đề cá nhân? Linux có cung cấp bất kỳ lệnh cụ thể nào có thể giết hoặc gửi tín hiệu dừng tới bất kỳ luồng cụ thể nào trong một quy trình không?


Chương trình phục hồi gói của bạn là gì? (Tôi không có nó trên máy tính để bàn Debian của tôi) Xin vui lòng cho biết thêm, có thể cung cấp một số liên kết. Vì vậy, chỉnh sửa câu hỏi của bạn để cải thiện.
Basile Starynkevitch

1
Tôi nghĩ rằng bạn không nhận ra rằng tín hiệu "dừng" dừng một quá trình, bất kể bạn gửi nó đến luồng nào.
David Schwartz


1
@ Md.Kawsaruzzaman Điều đó sẽ không hoạt động. Giả sử, ví dụ, luồng ở giữa phân bổ bộ nhớ và giữ khóa trên bộ cấp phát bộ nhớ. Nếu bạn dừng chuỗi, thì nó sẽ không bao giờ giải phóng khóa và cuối cùng các luồng khác cũng dừng lại. Dù bạn đang cố gắng làm gì, đây không phải là cách để làm điều đó. (Có thể bạn muốn dừng công việc mà thread được làm từ đang được thực hiện Nhưng bạn cần sự hợp tác của quá trình này để làm điều đó Nếu nó cung cấp không có cách nào để làm điều đó, nó không thể được thực hiện...)
David Schwartz

1
Cũng lưu ý rằng, trong ảnh chụp màn hình của bạn, mỗi "luồng" có một PID riêng. Tôi không chắc bạn thậm chí có thể nhắm mục tiêu các luồng riêng biệt, vì tín hiệu chỉ có thể được gửi đến các quy trình.
szalski

Câu trả lời:


16

Nói chung là khá nguy hiểm khi giết một luồng riêng lẻ từ một quy trình lớn hơn. Chủ đề đó có thể:

  • Được sửa đổi một số trạng thái chia sẻ với các chủ đề khác có thể bị hỏng
  • Giữ một số khóa không bao giờ được giải phóng, khiến khóa trở nên vô thời hạn
  • ... Hoặc bất kỳ số lượng những thứ khác có thể khiến các chủ đề khác bị sai.

Nói chung, bên ngoài quản lý và đồng bộ hóa bởi chính ứng dụng, việc giết các luồng riêng lẻ không phải là điều có ý nghĩa.


5
Điều này không hữu ích chút nào. OP đang yêu cầu làm thế nào để giết một chủ đề, không phải là họ nên hay không.
Martin

Những gì tôi muốn là quá trình để giết hoặc dừng bất kỳ chủ đề cụ thể cho một số mục đích. Tôi cho rằng do một số lỗi, đôi khi người nhận của chúng tôi sẽ tự động tắt. Chúng tôi đang tìm ra nguyên nhân khi chương trình được phát triển bởi chính R & D của chúng tôi. Bây giờ có một điều có thể là một số chủ đề sẽ tự động bị tắt. Chúng tôi đã kiểm tra từ phía mã và nhận được luồng con đó là độc lập nhưng đôi khi phía máy chủ vẫn nhận được một số luồng khiến cho toàn bộ quá trình cũng bị tắt ..
Md. Kawsaruzzaman

12

Bạn có thể sử dụng tgkill (2) hoặc tkilltrong chương trình C của mình (bạn sẽ cần sử dụng tòa nhà chọc trời ( 2) ) nhưng bạn không muốn . Từ bên trong chương trình của bạn, bạn có thể sử dụng pthread_kill (3) - điều này hiếm khi hữu ích.

(Tôi không biết chính xác hiệu ứng nào sẽ có tgkillhoặc tkill- ví dụ với SIGKILLhoặc SIGTERM- trên một chuỗi)

Các pthreads (7) thư viện sử dụng ở mức độ thấp thứ (bao gồm cả một số tín hiệu (7) -s và futex (7) -s vv ...; xem thêm nptl (7) ) và nếu bạn sống-chết (với tkillhoặc tgkill) một số luồng riêng lẻ, quá trình của bạn sẽ ở một số trạng thái sai (vì vậy hành vi không xác định ) bởi vì một số bất biến nội bộ sẽ bị phá vỡ.

Vì vậy, nghiên cứu các tài liệu của chương trình nhận gói của bạn và tìm một số cách khác. Nếu nó là phần mềm miễn phí , hãy nghiên cứu mã nguồn của nó và cải thiện nó.

Đọc kỹ tín hiệu (7)tín hiệu an toàn (7) . Tín hiệu có nghĩa là được gửi đến các quy trình (bằng cách giết (2) ) và được xử lý trong các luồng.

Và trong thực tế, tín hiệu và chủ đề không kết hôn tốt. Đọc một số hướng dẫn pthread .

Một mẹo phổ biến, khi mã hóa chương trình đa luồng (và muốn xử lý các tín hiệu bên ngoài như SIGTERM) là sử dụng một đường ống (7) cho quy trình của riêng bạn và thăm dò ý kiến ​​(2) trong một số luồng khác (bạn cũng có thể xem xét Linux dấu hiệu cụ thể (2) ), với bộ xử lý tín hiệu ghi (2) -ing một byte hoặc một vài trong số chúng vào đường ống đó. Thủ thuật nổi tiếng đó được giải thích rõ trong tài liệu Qt (và bạn có thể sử dụng nó trong chương trình của riêng bạn, ngay cả khi không có Qt).


4
Các tgkillchức năng cung cấp không có cách nào để chấm dứt một sợi. Nó sẽ gửi một tín hiệu đến một chủ đề. Nó được đặt tên là "giết" bởi vì đó là cách lịch sử để giết một quá trình và nó không thể được sử dụng để giết một chuỗi.
David Schwartz

Tôi đoán rằng gửi SIGKILLmột chủ đề là làm hại nó. Hay là nó luôn giết chết toàn bộ quá trình? Còn bạn thì SIGTERMsao? BTW, ngay cả khi chỉ có một luồng bị tổn hại, quan điểm của tôi là quá trình này ở trạng thái thảm khốc.
Basile Starynkevitch

5
Có, các tín hiệu SIGKILLSIGTERMđược xác định để giết hoặc chấm dứt quá trình. Điều đó đúng bất kể chủ đề nào nhận được chúng - chúng vẫn có nghĩa tương tự. Chấm dứt một chủ đề mà không có sự hợp tác chặt chẽ của quá trình của nó sẽ là một vụ xả súng và có thể là thảm họa đối với quá trình này.
David Schwartz
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.