#include #include #include #include #include #include #include int doshutdown = 0; static void set_shutdown(int sig); static void *threadfn(void *vd); static void set_shutdown(int sig) { printf("Got TERM signal\n"); fflush(stdout); doshutdown = 1; signal(SIGTERM, set_shutdown); return; } static void * threadfn(void *vd) { pid_t mypid = getpid(); printf("Starting thread (pid: %d) and sleeping 3 seconds\n", mypid); sleep(3); printf("Terminating thread\n"); return NULL; } int main(int argc, char *argv[]) { int rc; pthread_t mythread; pthread_attr_t mythread_attr; sigset_t proc_mask; int resetmask; pid_t mypid = getpid(); if (argc != 2) { fprintf(stderr, "usage: %s <0|1>\n", argv[0]); exit(1); } resetmask = atoi(argv[1]); if (resetmask) { printf("Clearing procmask\n"); (void)sigemptyset(&proc_mask); rc = sigprocmask(SIG_SETMASK, &proc_mask, NULL); if (rc != 0) { fprintf(stderr, "Failed to set sigprocmask\n"); exit(1); } } signal(SIGTERM, set_shutdown); printf("Created thread\n"); printf("Please, send TERM signal to pid %d\n", mypid); pthread_attr_init(&mythread_attr); pthread_attr_setdetachstate(&mythread_attr, PTHREAD_CREATE_DETACHED); pthread_attr_setscope(&mythread_attr, PTHREAD_SCOPE_SYSTEM); pthread_create(&mythread, &mythread_attr, threadfn, NULL); while (!doshutdown); exit(0); }