Linux'ta bir işlem altında tek bir iş parçacığı nasıl öldürülür?


13

resim açıklamasını buraya girin

Bunlar Paket Alıcı sürecinin ayrı ayrı iş parçacıklarıdır. Herhangi bir evreni öldürmenin bir yolu var mı? Linux, bir işlem altındaki belirli bir iş parçacığını durdurabilecek veya durdurabilecek belirli bir komut sağlıyor mu?


Packet Reciever programınız nedir? (Debian masaüstümde yok) Lütfen daha fazla bilgi verin, belki bir bağlantı sağlayın. Yani senin soruyu düzenlemek geliştirmek.
Basile Starynkevitch

1
"Dur" sinyalinin, hangi iş parçacığına gönderdiğinize bakılmaksızın bir işlemi durdurduğunu bilmediğinizi düşünüyorum.
David Schwartz


1
@ Md.Kawsaruzzaman Bu işe yaramayacak. Örneğin, iş parçacığının bellek ayırmanın ortasında olduğunu ve kilidi bellek ayırıcısı üzerinde tuttuğunu varsayalım. İpliği durdurursanız, kilidi asla serbest bırakmaz ve sonunda diğer dişler de durur. Yapmaya çalıştığınız her ne ise, bunu yapmanın yolu bu değil. (İş parçacığının yaptığı çalışmayı durdurmak isteyebilirsiniz. Ancak bunu yapmak için sürecin işbirliğine ihtiyacınız var. Bunu yapmanın bir yolu yoksa, yapılamaz.)
David Schwartz

1
Ayrıca, ekran görüntünüzde her "iş parçacığının" ayrı bir PID'si olduğunu unutmayın. Sinyalleri yalnızca işlemlere gönderilebileceği için ayrı evreleri bile hedefleyebileceğinizden emin değilim.
szalski

Yanıtlar:


16

Genel olarak tek bir ipliği daha büyük bir işlemden öldürmek oldukça tehlikelidir. Bu konu şöyle olabilir:

  • Paylaşılan durumu, bozulabilecek diğer iş parçacıklarıyla değiştirme
  • Asla serbest bırakılmayan bir kilidin tutulması, kilidin süresiz olarak kullanılmamasına neden olması
  • ... veya diğer evrelerin yanlış gitmesine neden olabilecek herhangi bir sayıda başka şey.

Genel olarak, uygulamanın kendisi tarafından yönetim ve senkronizasyon dışında, tek tek iş parçacıklarını öldürmek mantıklı bir şey değildir.


5
Bu hiç faydalı değil. OP bir iş parçacığını nasıl öldürüp öldürmeyeceğini soruyor .
Martin

Ne istiyorum süreci öldürmek veya bazı amaç için herhangi bir belirli iplik durdurmak için. Bazı hatalar nedeniyle bazen alıcımızın otomatik olarak kapatıldığını varsayıyorum. Programın kendi Ar-Ge'miz tarafından geliştirilmesinin nedenlerini buluyoruz. Şimdi, bazı iş parçacıklarının otomatik olarak kapatılması olasılığı olabilir. Biz kod tarafında test var ve çocuk iş parçacığı bağımsız ama sunucu tarafında hala bazı süreçleri bazen de toplam işleminin de kapanmasına neden oluyor var ..
Md. Kawsaruzzaman

12

Sen kullanabilir tgkill (2) ya da tkillC programınızda (Kullanım gerekir syscall (2) ) ama sen istemiyorsun . Programınızın içinden , nadiren yararlı olan pthread_kill (3) kullanabilirsiniz .

(Tam olarak ne etkisi olacağını bilmiyorum tgkillveya tkill- örneğin SIGKILLveya SIGTERMbir iş parçacığı üzerinde -)

Pthreads (7) kütüphane kullanımları düşük seviyeli şeyler (bazı dahil sinyali (7) -s ve FUTEX (7) -s vb ...; ayrıca bkz nptl (7) ) ve eğer-çiğ öldürülmüş (ile tkillveya tgkill) bazı bireysel iş parçacığı, işleminiz bazı yanlış durumda ( tanımsız davranış ) olacaktır çünkü bazı iç değişmezler bozulacaktır.

Bu yüzden paket alıcı programınızın belgelerini inceleyin ve başka bir yol bulun. Eğer durum bu ise özgür yazılım , kaynak kodu incelemek ve onu geliştirmek.

Sinyal (7) ve sinyal güvenliği (7) daha dikkatli okuyun . Sinyaller, işlemlere ( kill (2) ile ) gönderilir ve iş parçacıklarıyla işlenir.

Ve pratikte, sinyaller ve iplikler iyi evlenmez. Bazı pthread eğitimini okuyun .

Çok iş parçacıklı bir programı kodlarken (ve harici sinyalleri işlemek istemek gibi SIGTERM) yaygın bir hile, kendi işleminize bir boru (7) kullanmak ve başka bir iş parçacığında bu boruyu yoklamak (2) (Linux'u da düşünebilirsiniz) belirli bir sinyalfd (2) ) ile bir sinyal vericinin bir boruya bir bayt veya birkaç tanesini yazması (2) . Bu iyi hile Qt belgelerinde iyi açıklanmıştır (ve Qt olmadan bile kendi programınızda kullanabilirsiniz).


4
tgkillİşlevi, bir iş parçacığı sonlandırmak için hiçbir yol sağlar. Bir iş parçacığına sinyal gönderir. "Kill" olarak adlandırılır, çünkü bir süreci öldürmenin tarihsel yoludur ve bir iş parçacığını öldürmek için kullanılamaz.
David Schwartz

Sanırım SIGKILLbir iş parçacığına gönderme onu zarar veriyor. Yoksa her zaman tüm süreci mi öldürüyor? Peki ya SIGTERM? BTW, sadece bir iş parçacığına zarar verse bile, amacım sürecin korkunç durumda olmasıdır.
Basile Starynkevitch

5
Evet, SIGKILLve SIGTERMsinyalleri işlemi öldürmek veya sonlandırmak için tanımlanır. Bu, hangi ipliğin onları aldığından bağımsız olarak doğrudur - yine de aynı anlama gelir. Bir iş parçacığının, süreci ile yakın işbirliği olmadan sona erdirilmesi, boktan bir çekim olacak ve muhtemelen sürece felaket olacaktır.
David Schwartz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.