/*
SIGUSR2, SIGUSR1, SIGHUP - обрабатываются тредами
SIGINT, SIGBUS, SIGSTOP - из main()
*/#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
#include <syslog.h>
enum defines {
NUMTHREADS = 3,
};
static void *fake_thread(void *arg) {
sigset_t *set = (sigset_t *) arg;
int sig = 0;
syslog(LOG_LOCAL7, "I'm Thread[%lu] waiting for signal....\n", pthread_self());
for (;;) {
/* Wait for signal... */
sigwait(set, &sig);
switch (sig) {
case (SIGHUP):
pthread_exit(NULL);
break;
default:
syslog(LOG_LOCAL7, "Thread[%d]:Signal[%d]\n", pthread_self(), sig);
continue;
}
}
return NULL;
}
static void s_handler(int dummy) {
syslog(LOG_LOCAL7, "I fucked by signal %d\n", dummy);
}
/* Структура передаваемая в нити */
struct st_thread {
sigset_t set; /* сигнальная пер. */
char *data;
int reserved;
} __attribute__((packed)) st_thread;
int main(void) {
struct st_thread pst_thread[NUMTHREADS];
pthread_attr_t pattr;
pthread_t pth[NUMTHREADS];
int i;
sigemptyset(&pst_thread->set);
sigaddset(&pst_thread->set, SIGUSR2);
sigaddset(&pst_thread->set, SIGUSR1);
sigaddset(&pst_thread->set, SIGHUP);
pthread_sigmask(SIG_BLOCK, &pst_thread->set, NULL); // блокируем
pthread_attr_init(&pattr); // навсякий...
pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_DETACHED);
for (i = 0; i < NUMTHREADS; i++) {
if (
pthread_create(&pth[i],
&pattr, // хрень всяка
&fake_thread, // функция
(void *) &pst_thread) // нужности
!= 0)
syslog(LOG_LOCAL7, "ERROR: pthread_create [%d]", i);
}
struct sigaction sact;
sact.sa_handler = s_handler;
sigemptyset(&sact.sa_mask);
sact.sa_flags = 0;
sigaction(SIGINT, &sact, (struct sigaction *) NULL);
sigaction(SIGBUS, &sact, (struct sigaction *) NULL);
sigaction(SIGSTOP, &sact, (struct sigaction *) NULL);
while (1)
sleep(10);
return 0;
}