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?
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?
Yanıtlar:
Genel olarak tek bir ipliği daha büyük bir işlemden öldürmek oldukça tehlikelidir. Bu konu şöyle olabilir:
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.
Sen kullanabilir tgkill (2) ya da tkill
C 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 tgkill
veya tkill
- örneğin SIGKILL
veya SIGTERM
bir 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 tkill
veya 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).
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.
SIGKILL
bir 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.
SIGKILL
ve SIGTERM
sinyalleri 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.