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 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).
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.
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.
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.