#include #include #include void clean(void *arg) { printf("clean\n"); } void *thr_routine(void *arg) { sigset_t set; sigemptyset(&set); sigaddset(&set, SIGUSR1); pthread_cleanup_push(clean, NULL); sigsuspend(&set); pthread_cleanup_pop(0); } int main() { pthread_t td; void *result; pthread_create(&td, NULL, thr_routine, NULL); sleep(1); pthread_cancel(td); pthread_join(td, &result); printf("%d\n", (int)result); }