Đâ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?
Đâ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?
Câu trả lời:
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ể:
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.
Bạn có thể sử dụng tgkill (2) hoặc tkill
trong 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ó tgkill
hoặc tkill
- ví dụ với SIGKILL
hoặ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 tkill
hoặ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) và 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).
tgkill
chứ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.
SIGKILL
mộ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ì SIGTERM
sao? 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.
SIGKILL
và SIGTERM
đượ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.