Bir işlemin belirli bir iş parçacığını nasıl öldürebilirim?


21
$ ps -e -T | grep myp | grep -v grep
  797   797 ?        00:00:00 myp
  797   798 ?        00:00:00 myp
  797   799 ?        00:00:00 myp
  797   800 ?        00:00:00 myp

Bu, mypPID = 797 olan işlemi ve farklı SPID'lere sahip dört iş parçacığını gösterir .

Tüm süreci öldürmeden sürecin belirli bir parçasını nasıl öldürebilirim. Belirli bir konudaki ölümcül bağımlılıklar olduğunda, bazı durumlarda hiçbir zaman mümkün olamayacağını anlıyorum. Ancak, her durumda mümkün mü? Evet, nasıl?

Denedim kill 799ve sürecin kendisi sonlandırıldı. Şimdi bunun myp, işlem olmadan başarısızlığa uğramış bağımlılıklar olduğu 800ya da öldürmenin, bireysel işlemleri öldürememesi basit olduğu için emin değilim .

Yanıtlar:


26

Konular sürecin ayrılmaz bir parçasıdır ve bunun dışında öldürülemez. Pthread_kill işlevi var, ancak yalnızca iş parçacığı bağlamında geçerlidir. Bağlantıdaki dokümanlardan:

Pthread_kill () 'nin sadece sinyalin verilen konu bağlamında ele alınmasına neden olduğuna dikkat edin; sinyal eylemi (sonlandırma veya durdurma) süreci bir bütün olarak etkiler.


+1. sadece buraya eklemek için. işlem içinde pthread_kill () işlevini ayrı bir konuya sinyal göndermek için kullanabilirsiniz. Belki bunu yapan bazı sinyal işleyicileri ekleyebilirsiniz.
Hemant

@hemant: MS Word'ün yazım denetimi için ayrı bir iş parçacığı kullandığını varsayalım. Bu ipliği öldürmek, bu şekilde tasarlanmadıkça her şeyi aşağı indirmemelidir. Bu gibi durumlarda neden bu iş parçacığı olmadan süreç mevcut değil?
Lazer

1
Sanırım bir üst süreçten bağımsız olacak şekilde bir dışa aktarma modeli tasarlayabilir, ancak dış süreçlerin süreç içi dişleri öldürmesine izin verebilir, ancak bu güvenlik, süreç yönetimi ve benim sistemimin bütünlüğü konusunda solucan konserveleri açar. Herhangi bir sistem tasarımcısının kendilerini isteyerek teslim edeceğini sanmıyor. Bu tür baş ağrıları olmadan, diş açmak yeterince zordur. Bir ipliğin iç kısımdan öldürülmesi sorun değildir, çünkü herhangi bir sorun çıkması halinde ve otomatik olarak veya başka bir şekilde ortaya çıkması durumunda sorumlu tutulan ana süreç tarafından iş yapılır.
gvkv

"bu şekilde tasarlanmadığı sürece": İplik kullanmanın temel nedeni, kaynakları paylaşabilmeniz için tam olarak geçerlidir. Yarım evin yıkılması gibi bir şey.
pjc50

2
@Lazer, bir iş parçacığı yazım denetimi yaptığınız için aynı anda başka bir iş parçacığı yazdığınız için metni güncelleştiriyor. Bu nedenle, arka plan yazım denetimi iş parçacığı olması için, diğer iş parçacığının metni değiştirmesini önlemek, kelimelerin bazılarının bir kopyasını çıkarmak, kilidi serbest bırakmak ve ardından kopyalanan kelimeleri kontrol etmek için bir kilit kapmak gibi bir şey yapması gerekir. arka fon. Kilidi tutarken onu öldürdüyseniz, yazmaya başlar başlamaz diğer ipliği asarsınız. Çok iş parçacıklı uygulamalar bunun gibi karşılıklı bağımlılıklarla doludur.
psusi

6

Bu sorunun kanonik cevabı şudur: Sürecin işbirliği ile, hangi mekanizma ile olursa olsun. Sürecin işbirliği olmadan bu mümkün değildir. İşlemin iş parçacıklarından oluştuğu, kasıtlı tasarımla, işlemin dışında kalmayan işlemin bir iç detayıdır.


Ve diğer sinyalleri komut satırından göndermeye ne dersiniz?
yucer

@ yucer Ne istediğinizi anladığımdan emin değilim.
David Schwartz,

"Kill -l" ile gösterilen listeden başka bir sinyal göndermek istiyorum. Ne yaptığını görmek için yığın izini dökmek için belirli bir iş parçacığı komutu vermek için bir yol arıyorum.
yucer

@ yucer Bu platforma özgü olacak. Bazıları yığın dökmek için belirli bir iş parçacığı komut vermek için bir yol sağlar. Şahsen, sürece bir hata ayıklayıcı (gibi gdb) eklemek için bir komut dosyası kullanmak , yığını dökmek için tüm iş parçacıkları komutunu vermek ve sonra ayırmak için daha kolay buldum .
David Schwartz

1

@ Gkv'nin cevabının tepesinde, fonksiyonunun bir pthread_cancel(3)kısmına bakabilirsiniz <pthread.h>. Man sayfasından:

Pthread_cancel () işlevi, iş parçacığına bir iptal isteği gönderir. Hedef ipliğin iptal isteğine tepki verip vermediği ve ne zaman tepki göstereceği, o ipliğin kontrolünde olan iki özelliğe bağlıdır: iptal edilebilirlik durumu ve tipi.


1

Tgkill () 'i faydalı bulabilirsiniz . Bu, man sayfasından da söz edildiği gibi Linux'a özgüdür.

tgkill (), tgid iplik grubundaki thread ID tid ile dişe işaret sinyali gönderir. (Buna karşılık, kill (2) yalnızca bir işleme (yani, iplik grubuna) bir bütün olarak bir sinyal göndermek için kullanılabilir ve sinyal, bu işlem içindeki isteğe bağlı bir ipliğe iletilir.)


Bu, bir ipliğin nasıl öldürüleceği ile ilgili bir soruyu ele almaz, bir ipliğe nasıl sinyal gönderileceğini değil.
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.