1b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#define _GNU_SOURCE 2b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <string.h> 3b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <pthread.h> 4b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdlib.h> 5b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <stdio.h> 6b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <fcntl.h> 7b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <unistd.h> 8b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/types.h> 9b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sys/syscall.h> 10b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#include <sched.h> 11eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov#include <signal.h> 12b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int loops = 15; // each thread+main will do this amount of loop 13b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int sleepms = 1000; // in each loop, will sleep "sleepms" milliseconds 14b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int burn = 0; // after each sleep, will burn cpu in a tight 'burn' loop 15eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void setup_sigusr_handler(void); // sigusr1 and 2 sigaction setup. 16b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 17b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pid_t gettid() 18b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 19b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef __NR_gettid 20b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return syscall(__NR_gettid); 21b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else 22b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return getpid(); 23b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 24b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 25b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// will be invoked from gdb. 26b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void whoami(char *msg) __attribute__((unused)); 27b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void whoami(char *msg) 28b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 29b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "pid %d Thread %d %s\n", getpid(), gettid(), msg); 30b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fflush(stderr); 31b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 32b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 33b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 34b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void do_burn () 35b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int i; 37b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int loopnr = 0; 38b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // one single line for the below, to ensure interrupt on this line. 39b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < burn; i++) loopnr++; 40b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int thread_ready = 0; 43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pthread_cond_t ready = PTHREAD_COND_INITIALIZER; 44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic pthread_mutex_t ready_mutex = PTHREAD_MUTEX_INITIALIZER; 45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void signal_ready (void) 46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 47b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int rc; 48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_mutex_lock(&ready_mutex); 49b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 50b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "signal_ready lock error %d_n", rc); 51b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov thread_ready = 1; 52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_cond_signal(&ready); 53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "signal_ready signal error %d_n", rc); 55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_mutex_unlock(&ready_mutex); 56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 57b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "signal_ready unlock error %d_n", rc); 58b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 59b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 60b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstruct spec { 61b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char *name; 62b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int sleep; 63b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int burn; 64b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int t; 65b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov}; 66b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic struct timeval t[4]; 67b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic int nr_sleeper_or_burner = 0; 68b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic volatile int report_finished = 1; 69b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// set to 0 to have no finish msg (as order is non-deterministic) 70b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void *sleeper_or_burner(void *v) 71b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 72b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int i = 0; 73b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct spec* s = (struct spec*)v; 74b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 75b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "%s ready to sleep and/or burn\n", s->name); 76b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fflush (stderr); 77b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov signal_ready(); 78b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov nr_sleeper_or_burner++; 79b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov for (i = 0; i < loops; i++) { 81b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (sleepms > 0 && s->sleep) { 82b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov t[s->t].tv_sec = sleepms / 1000; 83b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov t[s->t].tv_usec = (sleepms % 1000) * 1000; 84b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov select (0, NULL, NULL, NULL, &t[s->t]); 85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (burn > 0 && s->burn) 87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov do_burn(); 88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (report_finished) { 90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "%s finished to sleep and/or burn\n", s->name); 91b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fflush (stderr); 92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 93b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return NULL; 94b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 95b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// wait till a thread signals it is ready 97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void wait_ready(void) 98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov int rc; 100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_mutex_lock(&ready_mutex); 101b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 102b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "wait_ready lock error %d_n", rc); 103b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov while (! thread_ready && rc == 0) { 104b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_cond_wait(&ready, &ready_mutex); 105b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 106b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "wait_ready wait error %d_n", rc); 107b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 108b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov thread_ready = 0; 109b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov rc = pthread_mutex_unlock(&ready_mutex); 110b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (rc != 0) 111b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "wait_ready unlock error %d_n", rc); 112b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 113b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 114b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// We will lock ourselves on one single cpu. 115b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// This bypasses the unfairness of the Valgrind scheduler 116b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// when a multi-cpu machine has enough cpu to run all the 117b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov// threads wanting to burn cpu. 118b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovstatic void setaffinity(void) 119b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 120b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifdef VGO_linux 121b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov cpu_set_t single_cpu; 122b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov CPU_ZERO(&single_cpu); 123b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov CPU_SET(1, &single_cpu); 124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov (void) sched_setaffinity(0, sizeof(single_cpu), &single_cpu); 125b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif 126b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov // GDBTD: equivalent for Darwin ? 127b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 128b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanovint main (int argc, char *argv[]) 130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov{ 131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char *threads_spec; 132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_t ebbr, egll, zzzz; 133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov struct spec b, l, p, m; 134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov char *some_mem __attribute__((unused)) = malloc(100); 135b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov setaffinity(); 136eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov setup_sigusr_handler(); 137b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc > 1) 138b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov loops = atoi(argv[1]); 139b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc > 2) 141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sleepms = atoi(argv[2]); 142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc > 3) 144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov burn = atoll(argv[3]); 145b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 146b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (argc > 4) 147b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov threads_spec = argv[4]; 148b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov else 149b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov threads_spec = "BSBSBSBS"; 150b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 151b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fprintf(stderr, "loops/sleep_ms/burn/threads_spec: %d %d %d %s\n", 152b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov loops, sleepms, burn, threads_spec); 153b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov fflush(stderr); 154b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 155b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov b.name = "Brussels"; 156b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov b.burn = *threads_spec++ == 'B'; 157b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov b.sleep = *threads_spec++ == 'S'; 158b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov b.t = -1; 159b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (b.burn || b.sleep) { 160b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov b.t = 1; 161b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_create(&ebbr, NULL, sleeper_or_burner, &b); 162b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov wait_ready(); 163b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 164b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 165b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov l.name = "London"; 166b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov l.burn = *threads_spec++ == 'B'; 167b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov l.sleep = *threads_spec++ == 'S'; 168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov l.t = -1; 169b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (l.burn || l.sleep) { 170b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov l.t = 2; 171b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_create(&egll, NULL, sleeper_or_burner, &l); 172b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov wait_ready(); 173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p.name = "Petaouchnok"; 176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p.burn = *threads_spec++ == 'B'; 177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p.sleep = *threads_spec++ == 'S'; 178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p.t = -1; 179b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (p.burn || p.sleep) { 180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov p.t = 3; 181b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov pthread_create(&zzzz, NULL, sleeper_or_burner, &p); 182b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov wait_ready(); 183b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov } 184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov m.name = "main"; 186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov m.burn = *threads_spec++ == 'B'; 187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov m.sleep = *threads_spec++ == 'S'; 188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov m.t = 0; 189b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov sleeper_or_burner(&m); 190b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 191b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (b.t != -1) pthread_join(ebbr, NULL); 192b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (l.t != -1) pthread_join(egll, NULL); 193b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov if (p.t != -1) pthread_join(zzzz, NULL); 194b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov 195b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov return 0; 196b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov} 197eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 198eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic int sigusr1_received = 0; 199eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void sigusr1_handler(int signr) 200eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{ 201eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov sigusr1_received++; 202eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov} 203eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanovstatic void setup_sigusr_handler(void) 204eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov{ 205eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov struct sigaction sa; 206eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov sa.sa_handler = sigusr1_handler; 207eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov sigemptyset(&sa.sa_mask); 208eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov sa.sa_flags = 0; 209eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 210eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sigaction (SIGUSR1, &sa, NULL) != 0) 211eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov perror("sigaction SIGUSR1"); 212eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 213eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov sa.sa_handler = SIG_IGN; 214eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov if (sigaction (SIGUSR2, &sa, NULL) != 0) 215eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov perror("sigaction SIGUSR2"); 216eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov} 217eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov 218