#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <sched.h> #include <signal.h> #include <unistd.h>
#define THREADS 11
void signal_handler(int signal_num) { if (signal_num == SIGUSR1) { printf("Received SIGUSR1 at process: %d , thread: %lu\n", getpid(), pthread_self()); } }
void *worker(void *arg) { struct sched_param param; int policy = SCHED_FIFO; param.sched_priority = 50; if (pthread_setschedparam(pthread_self(), policy, ¶m)) { perror("pthread_setschedparam"); exit(EXIT_FAILURE); } if(arg != NULL) { printf("signal handler thread %lu\n", pthread_self()); sigset_t set; int signal_num; sigemptyset(&set); sigaddset(&set, SIGUSR1); while (1) { sigwait(&set, &signal_num); printf("Received signal %d at thread %lu\n", signal_num, pthread_self()); } } else { printf("thread %lu\n", pthread_self()); while (1) { sleep(1); } }
return NULL; }
int main() { pthread_t tid[THREADS]; int i;
pid_t pid = getpid(); printf("pid: %d\n", pid); sigset_t set; sigemptyset(&set); sigaddset(&set, SIGUSR1); pthread_sigmask(SIG_BLOCK, &set, NULL); printf("Main thread %lu\n", pthread_self()); for (i = 0; i < THREADS; i++) { if (pthread_create(&tid[i], NULL, worker, NULL)) { perror("pthread_create"); exit(EXIT_FAILURE); } } int f = 1; pthread_t sighandler; pthread_create(&sighandler, NULL, worker, &f);
for (i = 0; i < THREADS; i++) { if (pthread_join(tid[i], NULL)) { perror("pthread_join"); exit(EXIT_FAILURE); } } pthread_join(sighandler, NULL);
return 0; }
|