Это отдельные потоки процесса получения пакетов. Есть ли способ убить какой-то отдельный поток? Предоставляет ли Linux какую-либо конкретную команду, которая может уничтожить или отправить сигнал остановки любому конкретному потоку в процессе?
Это отдельные потоки процесса получения пакетов. Есть ли способ убить какой-то отдельный поток? Предоставляет ли Linux какую-либо конкретную команду, которая может уничтожить или отправить сигнал остановки любому конкретному потоку в процессе?
Ответы:
Обычно убивать отдельный поток из более крупного процесса довольно опасно. Эта тема может:
В целом, помимо управления и синхронизации самим приложением, нет смысла убивать отдельные потоки.
Вы можете использовать tgkill (2) или tkill
в своей C-программе (вам нужно использовать syscall (2) ), но вы не хотите . Внутри вашей программы вы можете использовать pthread_kill (3), что редко бывает полезно.
(Я точно не знаю, какой эффект будет иметь tgkill
или tkill
- например, с SIGKILL
или SIGTERM
- на поток)
Библиотека pthreads (7) использует низкоуровневые вещи (включая некоторые signal (7) -s и futex (7) -s и т. Д.; См. Также nptl (7) ), и если вы убили raw (с помощью tkill
или tgkill
) В отдельном потоке ваш процесс будет в неправильном состоянии (так что неопределенное поведение ), потому что какой-то внутренний инвариант будет нарушен.
Поэтому изучите документацию вашей программы приема пакетов и найдите другой способ. Если это свободное программное обеспечение , изучите его исходный код и улучшите его.
Прочитайте более внимательно сигнал (7) и сигнал безопасности (7) . Сигналы предназначены для отправки в процессы ( kill (2) ) и обработки в потоках.
И на практике сигналы и потоки плохо сочетаются. Прочитайте некоторый учебник .
Обычная хитрость, когда кодируете многопоточную программу (и хотите обрабатывать внешние сигналы, такие как SIGTERM
), это использовать канал (7) для вашего собственного процесса и опрашивать (2) этот канал в каком-то другом потоке (вы также можете рассмотреть Linux конкретный signalfd (2) ), с помощью устройства для записи сигнала, записать (2) -байт байта или нескольких из них в этот канал. Этот хорошо известный трюк хорошо объяснен в документации Qt (и вы можете использовать его в своей собственной программе, даже без Qt).
tgkill
Функция не дает никакой возможности прекратить поток. Он отправляет сигнал в поток. Он называется «убить», потому что это исторический способ уничтожения процесса, и его нельзя использовать для уничтожения потока.
SIGKILL
ветки вредит. Или это всегда убивает весь процесс? А как насчет SIGTERM
? Кстати, даже если причинен вред только потоку, я хочу сказать, что процесс находится в ужасном состоянии.
SIGKILL
и SIGTERM
сигналы определены, чтобы убить или завершить процесс. Это верно независимо от того, какой поток их получает - они все равно означают одно и то же. Прекращение потока без тесного сотрудничества с его процессом будет дерьмовым выстрелом и, вероятно, будет катастрофическим для процесса.