#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <pthread.h> #include <signal.h> #define MAXT 10 static void sig(int s) { struct timespec ts = { 100000, 0 }; printf("got %p\n", &ts); nanosleep(&ts, NULL); } void * run(void *v) { size_t *i = v; int c = *i; for (;;) { // printf("%d %zu\n", c, *i); sleep(1); } } int main(int argc, char *argv[]) { pthread_t t[MAXT]; stack_t ss; ss.ss_sp = malloc(SIGSTKSZ); printf("%p\n", ss.ss_sp); ss.ss_flags = 0; ss.ss_size = SIGSTKSZ; sigaltstack(&ss, NULL); struct sigaction sa; sa.sa_handler = sig; sa.sa_flags = SA_ONSTACK | SA_RESTART; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, NULL); for (size_t i = 0; i < MAXT; i++) { pthread_create(&t[i], NULL, run, &i); sched_yield(); } printf("sleeping\n"); sleep(5); for (size_t i = 0; i < MAXT; i++) { pthread_kill(t[i], SIGUSR1); } printf("waiting\n"); sleep(5); // pthread_join(); return 0; }