Blame docs/code/signal/main.c

Packit Service 7c31a4
#include <stdio.h>
Packit Service 7c31a4
#include <stdlib.h>
Packit Service 7c31a4
#include <unistd.h>
Packit Service 7c31a4
#include <uv.h>
Packit Service 7c31a4
Packit Service 7c31a4
uv_loop_t* create_loop()
Packit Service 7c31a4
{
Packit Service 7c31a4
    uv_loop_t *loop = malloc(sizeof(uv_loop_t));
Packit Service 7c31a4
    if (loop) {
Packit Service 7c31a4
      uv_loop_init(loop);
Packit Service 7c31a4
    }
Packit Service 7c31a4
    return loop;
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
void signal_handler(uv_signal_t *handle, int signum)
Packit Service 7c31a4
{
Packit Service 7c31a4
    printf("Signal received: %d\n", signum);
Packit Service 7c31a4
    uv_signal_stop(handle);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
// two signal handlers in one loop
Packit Service 7c31a4
void thread1_worker(void *userp)
Packit Service 7c31a4
{
Packit Service 7c31a4
    uv_loop_t *loop1 = create_loop();
Packit Service 7c31a4
Packit Service 7c31a4
    uv_signal_t sig1a, sig1b;
Packit Service 7c31a4
    uv_signal_init(loop1, &sig1a);
Packit Service 7c31a4
    uv_signal_start(&sig1a, signal_handler, SIGUSR1);
Packit Service 7c31a4
Packit Service 7c31a4
    uv_signal_init(loop1, &sig1b);
Packit Service 7c31a4
    uv_signal_start(&sig1b, signal_handler, SIGUSR1);
Packit Service 7c31a4
Packit Service 7c31a4
    uv_run(loop1, UV_RUN_DEFAULT);
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
// two signal handlers, each in its own loop
Packit Service 7c31a4
void thread2_worker(void *userp)
Packit Service 7c31a4
{
Packit Service 7c31a4
    uv_loop_t *loop2 = create_loop();
Packit Service 7c31a4
    uv_loop_t *loop3 = create_loop();
Packit Service 7c31a4
Packit Service 7c31a4
    uv_signal_t sig2;
Packit Service 7c31a4
    uv_signal_init(loop2, &sig2;;
Packit Service 7c31a4
    uv_signal_start(&sig2, signal_handler, SIGUSR1);
Packit Service 7c31a4
Packit Service 7c31a4
    uv_signal_t sig3;
Packit Service 7c31a4
    uv_signal_init(loop3, &sig3;;
Packit Service 7c31a4
    uv_signal_start(&sig3, signal_handler, SIGUSR1);
Packit Service 7c31a4
Packit Service 7c31a4
    while (uv_run(loop2, UV_RUN_NOWAIT) || uv_run(loop3, UV_RUN_NOWAIT)) {
Packit Service 7c31a4
    }
Packit Service 7c31a4
}
Packit Service 7c31a4
Packit Service 7c31a4
int main()
Packit Service 7c31a4
{
Packit Service 7c31a4
    printf("PID %d\n", getpid());
Packit Service 7c31a4
Packit Service 7c31a4
    uv_thread_t thread1, thread2;
Packit Service 7c31a4
Packit Service 7c31a4
    uv_thread_create(&thread1, thread1_worker, 0);
Packit Service 7c31a4
    uv_thread_create(&thread2, thread2_worker, 0);
Packit Service 7c31a4
Packit Service 7c31a4
    uv_thread_join(&thread1);
Packit Service 7c31a4
    uv_thread_join(&thread2);
Packit Service 7c31a4
    return 0;
Packit Service 7c31a4
}