Bagaimana cara membunuh setiap utas dalam proses di linux?

13

masukkan deskripsi gambar di sini

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?

Md. Kawsaruzzaman
sumber
Apa program Penerima Paket Anda? (Saya tidak memilikinya di desktop Debian saya) Tolong beri tahu lebih banyak, mungkin berikan beberapa tautan. Jadi edit pertanyaan Anda untuk meningkatkan.
Basile Starynkevitch
1
Saya pikir Anda tidak menyadari bahwa sinyal "berhenti" menghentikan proses, terlepas dari utas apa Anda mengirimnya.
David Schwartz
1
Lampirkan dengan GDB dan bunuh utasnya , lalu lepaskan.
Martin
1
@ Md.Kawsaruzzaman Itu tidak akan berhasil. Misalkan, misalnya, utas berada di tengah mengalokasikan memori dan memegang kunci pada pengalokasi memori. Jika Anda menghentikan utas, maka tidak akan pernah melepaskan kunci dan akhirnya utas lainnya juga akan berhenti. Apa pun yang Anda coba lakukan, ini bukan cara untuk melakukannya. (Mungkin Anda ingin menghentikan pekerjaan yang sedang dikerjakan utas. Tetapi Anda membutuhkan kerja sama proses untuk melakukan itu. Jika tidak ada cara untuk melakukannya, itu tidak dapat dilakukan.)
David Schwartz
1
Perhatikan juga, dalam tangkapan layar Anda, setiap "utas" memiliki PID terpisah. Saya tidak yakin Anda bahkan dapat menargetkan utas terpisah, karena sinyal hanya dapat dikirim ke proses.
szalski

Jawaban:

16

Biasanya cukup berbahaya untuk membunuh utas individu dari proses yang lebih besar. Utas itu mungkin:

  • Jadilah memodifikasi beberapa negara yang dibagikan dengan utas lain yang dapat rusak
  • Jadilah memegang beberapa kunci yang tidak pernah dibebaskan, menyebabkan kunci menjadi tidak tersedia tanpa batas waktu
  • ... atau sejumlah hal lain yang mungkin menyebabkan utas lainnya salah.

Secara umum, di luar manajemen dan sinkronisasi oleh aplikasi itu sendiri, membunuh utas individu bukanlah sesuatu yang masuk akal untuk dilakukan.

Chris Down
sumber
5
Ini sama sekali tidak berguna. OP menanyakan cara membunuh utas, bukan apakah mereka seharusnya atau tidak.
Martin
Yang saya inginkan adalah proses untuk membunuh atau menghentikan utas tertentu untuk beberapa tujuan. Saya berasumsi bahwa karena beberapa kesalahan, terkadang receiver kami dimatikan secara otomatis. Kami menemukan penyebabnya karena program ini dikembangkan oleh R&D kami sendiri. Sekarang masalahnya adalah ada kemungkinan bahwa beberapa utas secara otomatis ditutup. Kami telah menguji dari sisi kode dan mendapatkan bahwa utas anak independen tetapi dari sisi server kadang-kadang ada beberapa utas yang menyebabkan total proses untuk ditutup juga ..
Ny. Kawsaruzzaman
12

Anda mungkin menggunakan tgkill (2) atau tkilldalam 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 tgkillatau tkill- misalnya dengan SIGKILLatau 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 tkillatau 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).

Basile Starynkevitch
sumber
4
The tgkillFungsi 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.
David Schwartz
Saya kira bahwa mengirim SIGKILLke 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.
Basile Starynkevitch
5
Ya, SIGKILLdan SIGTERMsinyal 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.
David Schwartz