Сабж. Основной процесс получает сигнал.
Однако потоки находятся в системных вызовах (accept, read, и т.д.). Собственно, как из них выйти?
Почитав документацию и stackoverflow я понимаю, что:
Сигналы - прерогатива процессов. И потому лишь главный поток (тот который в main()) чаще всего получает сигнал и его обрабатывает. Остальные потоки сигналы не получают
Собственно, мне нужно чтобы ВСЕ потоки получили сигнал и выполнили хендлер для того чтобы их «выбросило» из системных вызовов.
Демонстрационный код:
#define _BSD_SOURCE
#define _DEFAULT_SOURCE
#include <stdlib.h>
#include <signal.h>
#include <pthread.h>
#include <sys/stat.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <iso646.h>
#define n_threads 4
pthread_t threads[n_threads];
pthread_t main_thread;
static void signal_handler(int signo) {
pthread_t mypid = pthread_self();
if (mypid != main_thread) return;
for (unsigned i = 0; i < n_threads; i++) {
pthread_kill(threads[i], SIGINT);
}
}
void *worker() {
//sigset_t set;
//sigemptyset(&set);
//sigaddset(&set, SIGTERM);
//sigaddset(&set, SIGINT);
//pthread_sigmask(SIG_UNBLOCK, &set, NULL);
char buffer;
while(1) {
if (read(STDIN_FILENO, &buffer, 1) < 0 and errno == EINTR) return NULL;
}
return NULL;
}
int main() {
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
main_thread = pthread_self();
for (unsigned i = 0; i < n_threads; i++ ) {
pthread_create(&threads[i], NULL, worker, NULL);
}
for (unsigned i = 0; i < n_threads; i++ ) {
pthread_join(threads[i], NULL);
}
return EXIT_SUCCESS;
}
c99 test.c -lpthread
./a.out
После запуска пожмакайте Ctrl+C, результата не будет.
Убить процесс:
killall -SIGKILL a.out
P.S. Закомментированный код не работает.
РЕШЕНИЕ: Я лично выбрал вот это: Как выйти из системного вызова внутри потока? (комментарий)