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?
13
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.
źródło
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
lubtkill
- np. ZSIGKILL
lubSIGTERM
- 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
lubtgkill
) 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).źródło
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 coSIGTERM
? BTW, nawet jeśli tylko wątek zostanie uszkodzony, mam na myśli to, że proces jest w fatalnym stanie.SIGKILL
iSIGTERM
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.