Ini adalah utas individu dari proses Penerima Paket. Apakah ada cara untuk membunuh utas individu? Apakah Linux menyediakan perintah khusus yang dapat membunuh atau mengirim sinyal berhenti ke utas tertentu dalam proses?
Ini adalah utas individu dari proses Penerima Paket. Apakah ada cara untuk membunuh utas individu? Apakah Linux menyediakan perintah khusus yang dapat membunuh atau mengirim sinyal berhenti ke utas tertentu dalam proses?
Jawaban:
Biasanya cukup berbahaya untuk membunuh utas individu dari proses yang lebih besar. Utas itu mungkin:
Secara umum, di luar manajemen dan sinkronisasi oleh aplikasi itu sendiri, membunuh utas individu bukanlah sesuatu yang masuk akal untuk dilakukan.
Anda mungkin menggunakan tgkill (2) atau tkill
dalam program C Anda (Anda harus menggunakan syscall (2) ) tetapi Anda tidak mau . Dari dalam program Anda, Anda dapat menggunakan pthread_kill (3) - yang jarang berguna.
(Saya tidak tahu persis apa efek yang akan terjadi tgkill
atau tkill
- misalnya dengan SIGKILL
atau SIGTERM
- di utas)
The pthreads (7) menggunakan tingkat rendah perpustakaan hal (termasuk beberapa sinyal (7) -s dan futex (7) -s dll ...; lihat juga nptl (7) ) dan jika Anda baku-dibunuh (dengan tkill
atau tgkill
) beberapa Masing-masing utas, proses Anda akan berada dalam kondisi yang salah (sehingga perilaku tidak terdefinisi ) karena beberapa invarian internal akan rusak.
Jadi, pelajari dokumentasi program penerima paket Anda dan temukan cara lain. Jika ini perangkat lunak bebas , pelajari kode sumbernya dan tingkatkan.
Baca lebih cermat sinyal (7) dan keamanan sinyal (7) . Sinyal dimaksudkan untuk dikirim ke proses (oleh kill (2) ) dan ditangani dalam utas.
Dan dalam praktiknya, sinyal dan utas tidak menikah dengan baik. Baca beberapa tutorial pthread .
Trik yang umum, ketika coding program multi-threaded (dan ingin menangani sinyal eksternal seperti SIGTERM
) adalah dengan menggunakan pipa (7) untuk proses Anda sendiri dan polling (2) pipa di beberapa thread lain (Anda mungkin juga mempertimbangkan Linux signalfd spesifik (2) ), dengan penangan sinyal menulis (2) -dalam byte atau beberapa dari mereka ke dalam pipa itu. Trik terkenal itu dijelaskan dengan baik dalam dokumentasi Qt (dan Anda bisa menggunakannya dalam program Anda sendiri, bahkan tanpa Qt).
tgkill
Fungsi tidak menyediakan cara untuk mengakhiri benang. Ia mengirim sinyal ke utas. Disebut "bunuh" karena ini adalah cara historis untuk membunuh suatu proses dan tidak dapat digunakan untuk membunuh utas.
SIGKILL
ke utas merugikannya. Atau apakah itu selalu membunuh seluruh proses? Dan bagaimana SIGTERM
? BTW, bahkan jika hanya sebuah utas yang dirugikan, poin saya adalah bahwa prosesnya dalam kondisi mengerikan.
SIGKILL
dan SIGTERM
sinyal didefinisikan untuk membunuh atau menghentikan proses. Itu benar terlepas dari apa utas yang menerimanya - mereka tetap berarti hal yang sama. Mengakhiri utas tanpa kerja sama erat dari prosesnya akan menjadi omong kosong dan kemungkinan besar merupakan bencana bagi proses tersebut.