xref: /netbsd-src/external/mit/libuv/dist/docs/code/signal/main.c (revision 0e552da7216834a96e91ad098e59272b41087480)
1*0e552da7Schristos #include <stdio.h>
2*0e552da7Schristos #include <stdlib.h>
3*0e552da7Schristos #include <unistd.h>
4*0e552da7Schristos #include <uv.h>
5*0e552da7Schristos 
create_loop()6*0e552da7Schristos uv_loop_t* create_loop()
7*0e552da7Schristos {
8*0e552da7Schristos     uv_loop_t *loop = malloc(sizeof(uv_loop_t));
9*0e552da7Schristos     if (loop) {
10*0e552da7Schristos       uv_loop_init(loop);
11*0e552da7Schristos     }
12*0e552da7Schristos     return loop;
13*0e552da7Schristos }
14*0e552da7Schristos 
signal_handler(uv_signal_t * handle,int signum)15*0e552da7Schristos void signal_handler(uv_signal_t *handle, int signum)
16*0e552da7Schristos {
17*0e552da7Schristos     printf("Signal received: %d\n", signum);
18*0e552da7Schristos     uv_signal_stop(handle);
19*0e552da7Schristos }
20*0e552da7Schristos 
21*0e552da7Schristos // two signal handlers in one loop
thread1_worker(void * userp)22*0e552da7Schristos void thread1_worker(void *userp)
23*0e552da7Schristos {
24*0e552da7Schristos     uv_loop_t *loop1 = create_loop();
25*0e552da7Schristos 
26*0e552da7Schristos     uv_signal_t sig1a, sig1b;
27*0e552da7Schristos     uv_signal_init(loop1, &sig1a);
28*0e552da7Schristos     uv_signal_start(&sig1a, signal_handler, SIGUSR1);
29*0e552da7Schristos 
30*0e552da7Schristos     uv_signal_init(loop1, &sig1b);
31*0e552da7Schristos     uv_signal_start(&sig1b, signal_handler, SIGUSR1);
32*0e552da7Schristos 
33*0e552da7Schristos     uv_run(loop1, UV_RUN_DEFAULT);
34*0e552da7Schristos }
35*0e552da7Schristos 
36*0e552da7Schristos // two signal handlers, each in its own loop
thread2_worker(void * userp)37*0e552da7Schristos void thread2_worker(void *userp)
38*0e552da7Schristos {
39*0e552da7Schristos     uv_loop_t *loop2 = create_loop();
40*0e552da7Schristos     uv_loop_t *loop3 = create_loop();
41*0e552da7Schristos 
42*0e552da7Schristos     uv_signal_t sig2;
43*0e552da7Schristos     uv_signal_init(loop2, &sig2);
44*0e552da7Schristos     uv_signal_start(&sig2, signal_handler, SIGUSR1);
45*0e552da7Schristos 
46*0e552da7Schristos     uv_signal_t sig3;
47*0e552da7Schristos     uv_signal_init(loop3, &sig3);
48*0e552da7Schristos     uv_signal_start(&sig3, signal_handler, SIGUSR1);
49*0e552da7Schristos 
50*0e552da7Schristos     while (uv_run(loop2, UV_RUN_NOWAIT) || uv_run(loop3, UV_RUN_NOWAIT)) {
51*0e552da7Schristos     }
52*0e552da7Schristos }
53*0e552da7Schristos 
main()54*0e552da7Schristos int main()
55*0e552da7Schristos {
56*0e552da7Schristos     printf("PID %d\n", getpid());
57*0e552da7Schristos 
58*0e552da7Schristos     uv_thread_t thread1, thread2;
59*0e552da7Schristos 
60*0e552da7Schristos     uv_thread_create(&thread1, thread1_worker, 0);
61*0e552da7Schristos     uv_thread_create(&thread2, thread2_worker, 0);
62*0e552da7Schristos 
63*0e552da7Schristos     uv_thread_join(&thread1);
64*0e552da7Schristos     uv_thread_join(&thread2);
65*0e552da7Schristos     return 0;
66*0e552da7Schristos }
67