Są to poszczególne wątki procesu odbierania pakietów. Czy jest jakiś sposób na zabicie pojedynczego wątku? Czy Linux udostępnia jakieś konkretne polecenie, które może zabić lub wysłać sygnał stop do dowolnego konkretnego wątku w trakcie procesu?
Są to poszczególne wątki procesu odbierania pakietów. Czy jest jakiś sposób na zabicie pojedynczego wątku? Czy Linux udostępnia jakieś konkretne polecenie, które może zabić lub wysłać sygnał stop do dowolnego konkretnego wątku w trakcie procesu?
Odpowiedzi:
Zasadniczo zabicie pojedynczego wątku z większego procesu jest dość niebezpieczne. Ten wątek może:
Ogólnie rzecz biorąc, poza zarządzaniem i synchronizacją przez samą aplikację, zabijanie pojedynczych wątków nie ma sensu.
Możesz użyć tgkill (2) lub tkill
w swoim programie C (musisz użyć syscall (2) ), ale nie chcesz . Z poziomu programu możesz użyć pthread_kill (3) - co jest rzadko przydatne.
(Nie wiem dokładnie, jaki efekt miałby tgkill
lub tkill
- np. Z SIGKILL
lub SIGTERM
- na wątek)
Biblioteka pthreads (7) używa rzeczy niskiego poziomu (w tym niektórych sygnałów (7) i futex (7) -s itp.; Patrz także nptl (7) ) i jeśli zabiłeś na surowo (z tkill
lub tgkill
) niektóre w pojedynczym wątku proces byłby w złym stanie (tak niezdefiniowane zachowanie ), ponieważ niektóre wewnętrzne niezmienniki zostałyby zepsute.
Więc przestudiuj dokumentację swojego programu odbierającego pakiety i znajdź inny sposób. Jeśli jest to wolne oprogramowanie , przestudiuj jego kod źródłowy i popraw go.
Czytaj dalej ostrożnie sygnał (7) i bezpieczeństwo sygnału (7) . Sygnały mają być wysyłane do procesów (przez kill (2) ) i obsługiwane w wątkach.
A w praktyce sygnały i wątki nie pasują dobrze. Przeczytaj samouczek pthread .
Powszechną sztuczką podczas kodowania programu wielowątkowego (i chcącego obsługiwać zewnętrzne sygnały, takie jak SIGTERM
) jest użycie potoku (7) do własnego procesu i odpytywanie (2) tego potoku w innym wątku (możesz również rozważyć Linuksa specyficzne signalfd (2) ), z handeriem sygnału zapisz (2) - bajt lub kilka z nich do tej potoku. Ta dobrze znana sztuczka jest dobrze wyjaśniona w dokumentacji Qt (i możesz jej użyć we własnym programie, nawet bez Qt).
tgkill
funkcja nie umożliwia zakończenia wątku. Wysyła sygnał do wątku. Nazywa się to „kill”, ponieważ jest historycznym sposobem na zabicie procesu i nie można go użyć do zabicia wątku.
SIGKILL
wątku szkodzi mu. A może zawsze zabija cały proces? A co SIGTERM
? BTW, nawet jeśli tylko wątek zostanie uszkodzony, mam na myśli to, że proces jest w fatalnym stanie.
SIGKILL
i SIGTERM
są zdefiniowane w celu zabicia lub zakończenia procesu. Jest to prawdą niezależnie od tego, jaki wątek je otrzymuje - nadal oznaczają to samo. Zakończenie wątku bez ścisłego współdziałania jego procesu byłoby bzdurą i prawdopodobnie katastrofalne dla procesu.