Це окремі потоки процесу прийому пакетів. Чи є спосіб вбити якусь окрему нитку? Чи надає Linux якусь конкретну команду, яка може вбивати або відправляти стоп-сигнал в будь-який конкретний потік під час процесу?
Це окремі потоки процесу прийому пакетів. Чи є спосіб вбити якусь окрему нитку? Чи надає Linux якусь конкретну команду, яка може вбивати або відправляти стоп-сигнал в будь-який конкретний потік під час процесу?
Відповіді:
Як правило, вбивати окрему нитку в результаті більшого процесу досить небезпечно. Ця нитка може:
Взагалі поза межами управління та синхронізації самим додатком вбивство окремих потоків - це не те, що має сенс робити.
Ви можете використовувати 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).
tgkill
Функція не дає ніякої можливості припинити потік. Він посилає сигнал до потоку. Його називають "убивати", оскільки це історичний спосіб вбити процес, і він не може бути використаний для вбивства потоку.
SIGKILL
до потоку шкодить цьому. Або це завжди вбиває весь процес? А про що SIGTERM
? До речі, навіть якщо тільки нитка завдана шкоди, я мою думку про те, що процес знаходиться у важкому стані.
SIGKILL
і SIGTERM
сигнали визначені , щоб убити або припинити процес. Це правда незалежно від того, яка нитка їх отримує - вони все одно означають те саме. Розірвати нитку без тісної співпраці її процесу було б безладною стріляниною і, ймовірно, катастрофічною для цього процесу.