2011-06-06 10 views
7

Piszę program wielowątkowy, w którym chcę obsłużyć od użytkownika polecenie Ctrl-C w celu zakończenia wykonywania. O ile wiem, nie ma gwarancji, że główny wątek, który jest w stanie anulować każdy działający wątek, złapie sygnał. Czy w związku z tym konieczne jest posiadanie innego programu obsługi sygnału do kodu wątku roboczego, aby każdy mógł go złapać, jeśli nadejdzie, lub czy istnieje inny sposób, aby to zrobić z obsługą sygnału tylko w kodzie głównego wątku?przechwytywanie SIGINT w programie wielowątkowym

Odpowiedz

8

Możesz zablokować sygnały z wątku wywołującego za pomocą pthread_sigmask().

i jako blokowane sygnały są dziedziczone do nowo utworzonych wątków, możesz zablokować SIGINT w głównym wątku, a następnie uruchamianie innych wątków, a następnie odblokować go w głównym wątku, jeśli jest to korzystne.

+0

ale w ten sposób nie będzie sygnału sigint do stracenia, jeśli wątek dziecko zdarzy się go złapać i po prostu go ignoruje? – nikos

+1

@nikos: Tak, ale nie widzę związku z tym, co pisałem; Jeśli nić blokuje sygnał, nie może z definicji go złapać. – janneb

+1

@nikos: Sygnał nigdy nie jest dostarczany do wątku, który go zablokował (np. Za pomocą 'pthread_sigmask()') - różni się to od wątku przechwytywania i ignorowania go. Jeśli wszystkie wątki są zablokowane, główny wątek ma blokadę "SIGINT", a następnie zostanie dostarczony do głównego wątku. – caf

Powiązane problemy