diff third_party/libuv/docs/code/signal/main.c @ 160:948de3f54cea

[ThirdParty] Added libuv
author June Park <parkjune1995@gmail.com>
date Wed, 14 Jan 2026 19:39:52 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/third_party/libuv/docs/code/signal/main.c	Wed Jan 14 19:39:52 2026 -0800
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <uv.h>
+
+uv_loop_t* create_loop()
+{
+    uv_loop_t *loop = malloc(sizeof(uv_loop_t));
+    if (loop) {
+      uv_loop_init(loop);
+    }
+    return loop;
+}
+
+void signal_handler(uv_signal_t *handle, int signum)
+{
+    printf("Signal received: %d\n", signum);
+    uv_signal_stop(handle);
+}
+
+// two signal handlers in one loop
+void thread1_worker(void *userp)
+{
+    uv_loop_t *loop1 = create_loop();
+
+    uv_signal_t sig1a, sig1b;
+    uv_signal_init(loop1, &sig1a);
+    uv_signal_start(&sig1a, signal_handler, SIGUSR1);
+
+    uv_signal_init(loop1, &sig1b);
+    uv_signal_start(&sig1b, signal_handler, SIGUSR1);
+
+    uv_run(loop1, UV_RUN_DEFAULT);
+}
+
+// two signal handlers, each in its own loop
+void thread2_worker(void *userp)
+{
+    uv_loop_t *loop2 = create_loop();
+    uv_loop_t *loop3 = create_loop();
+
+    uv_signal_t sig2;
+    uv_signal_init(loop2, &sig2);
+    uv_signal_start(&sig2, signal_handler, SIGUSR1);
+
+    uv_signal_t sig3;
+    uv_signal_init(loop3, &sig3);
+    uv_signal_start(&sig3, signal_handler, SIGUSR1);
+
+    while (uv_run(loop2, UV_RUN_NOWAIT) || uv_run(loop3, UV_RUN_NOWAIT)) {
+    }
+}
+
+int main()
+{
+    printf("PID %d\n", getpid());
+
+    uv_thread_t thread1, thread2;
+
+    uv_thread_create(&thread1, thread1_worker, 0);
+    uv_thread_create(&thread2, thread2_worker, 0);
+
+    uv_thread_join(&thread1);
+    uv_thread_join(&thread2);
+    return 0;
+}