Як вбити окрему нитку під час процесу в Linux?


13

введіть тут опис зображення

Це окремі потоки процесу прийому пакетів. Чи є спосіб вбити якусь окрему нитку? Чи надає Linux якусь конкретну команду, яка може вбивати або відправляти стоп-сигнал в будь-який конкретний потік під час процесу?


Яка програма для отримання пакетів пакетів? (У мене його немає на робочому столі Debian) Будь ласка, розкажіть більше, можливо, надайте посилання. Тож відредагуйте своє запитання, щоб покращити.
Василь Старинкевич

1
Я думаю, ви не усвідомлюєте, що сигнал "стоп" зупиняє процес, незалежно від того, в яку нитку ви його надіслали.
Девід Шварц


1
@ Md.Kawsaruzzaman Це просто не буде працювати. Припустимо, наприклад, потік знаходиться в середині розподілу пам'яті і тримає замок на розподільнику пам'яті. Якщо ви зупините нитку, вона ніколи не відпустить замок, і врешті решт, інші нитки також зупиняться. Що б ви не намагалися зробити, це не спосіб зробити це. (Можливо, ви хочете припинити роботу тієї нитки, щоб її не було зроблено. Але для цього вам потрібна співпраця процесу. Якщо це не дає можливості зробити це, зробити це неможливо.)
Девід Шварц

1
Також зауважте, що на екрані екрану кожен "потік" має окремий PID. Я не впевнений, що ви могли націлити навіть окремі потоки, оскільки сигнали можуть надсилатися лише процесам.
szalski

Відповіді:


16

Як правило, вбивати окрему нитку в результаті більшого процесу досить небезпечно. Ця нитка може:

  • Змінюйте деякий загальний стан з іншими потоками, які можуть бути пошкоджені
  • Тримайте якийсь замок, який ніколи не звільняється, через що замок стає незмінно недоступним
  • ... або будь-яку кількість інших речей, які можуть призвести до помилок інших тем.

Взагалі поза межами управління та синхронізації самим додатком вбивство окремих потоків - це не те, що має сенс робити.


5
Це зовсім не корисно. ОП запитує, як вбити нитку, а не слід чи ні.
Мартін

Що я хочу - це процес вбити або зупинити якусь конкретну нитку з якоюсь метою. Я припускаю, що через певну помилку іноді наш приймач автоматично вимикається. Ми знаходимо причини, оскільки програма розробляється нашою власною науково-дослідною розробкою. Тепер справа в тому, що існує можливість, що деякі потоки автоматично закриваються. Ми перевірили з кодової сторони і зрозуміли, що дочірній потік є незалежним, але з боку сервера все ще отримують деякі потоки, що призводить до того, що загальний процес також вимикається ..
Md Kawsaruzzaman

12

Ви можете використовувати tgkill (2) або tkillу своїй програмі C (вам потрібно буде використовувати syscall (2) ), але цього не хочете . Зсередини програми ви можете використовувати pthread_kill (3) - що рідко буває корисним.

(Я точно не знаю, який ефект матиме tgkillабо tkill- наприклад, з ниткою SIGKILLабо SIGTERM-)

Бібліотека pthreads (7) використовує матеріали низького рівня (включаючи деякі сигнали (7) і futex (7) -s тощо); див. Також nptl (7) ), і якщо ви вбивали сирого (з tkillабо tgkill) Індивідуальний потік, ваш процес опинився б у якомусь неправильному стані (настільки невизначена поведінка ), оскільки якийсь внутрішній інваріант буде порушений.

Тому вивчіть документацію програми прийому пакетів і знайдіть інший спосіб. Якщо це вільне програмне забезпечення , вивчіть його вихідний код і вдосконаліть його.

Більш уважно читайте сигнал (7) та безпеку сигналу (7) . Сигнали призначені для надсилання процесам ( вбивству (2) ) і обробляються потоками.

І на практиці сигнали та потоки не вступають у шлюб добре. Прочитайте підручник з pthread .

Поширений трюк, коли кодує багатопотокову програму (і хочеш обробляти зовнішні сигнали, як-от SIGTERM) - це використовувати трубу (7) для власного процесу та опитувати (2) цю трубку в якійсь іншій потоці (можна також врахувати Linux специфічний signalfd (2) ) із записом передачі сигналу (2) -введення байта або декількох з них у цю трубу. Цей добре відомий трюк добре пояснений у документації Qt (і ви можете використовувати його у власній програмі навіть без Qt).


4
tgkillФункція не дає ніякої можливості припинити потік. Він посилає сигнал до потоку. Його називають "убивати", оскільки це історичний спосіб вбити процес, і він не може бути використаний для вбивства потоку.
Девід Шварц

Я здогадуюсь, що надсилання SIGKILLдо потоку шкодить цьому. Або це завжди вбиває весь процес? А про що SIGTERM? До речі, навіть якщо тільки нитка завдана шкоди, я мою думку про те, що процес знаходиться у важкому стані.
Базиль Старинкевич

5
Так, SIGKILLі SIGTERMсигнали визначені , щоб убити або припинити процес. Це правда незалежно від того, яка нитка їх отримує - вони все одно означають те саме. Розірвати нитку без тісної співпраці її процесу було б безладною стріляниною і, ймовірно, катастрофічною для цього процесу.
Девід Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.