Сабж. Основной процесс получает сигнал.
Однако потоки находятся в системных вызовах (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.outP.S. Закомментированный код не работает.
РЕШЕНИЕ: Я лично выбрал вот это: Как выйти из системного вызова внутри потока? (комментарий)







