Это отдельные потоки процесса получения пакетов. Есть ли способ убить какой-то отдельный поток? Предоставляет ли 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сигналы определены, чтобы убить или завершить процесс. Это верно независимо от того, какой поток их получает - они все равно означают одно и то же. Прекращение потока без тесного сотрудничества с его процессом будет дерьмовым выстрелом и, вероятно, будет катастрофическим для процесса.