summaryrefslogtreecommitdiff
path: root/man/event-quick-child.c
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-01-05 15:04:06 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2022-01-05 15:19:13 +0100
commit5ca99dfabda20927a0d47e5f19339d1b48f82f7a (patch)
tree46f82073e6ac93546b1a97a44fe923ec704086c9 /man/event-quick-child.c
parent9809a788e409278a8225b1542813f2e6c5765ef8 (diff)
downloadsystemd-5ca99dfabda20927a0d47e5f19339d1b48f82f7a.tar.gz
man: add example of sd_event_add_child()
The thing with blocking SIGCHLD is rather annoying. I think we could/should make this automatic.
Diffstat (limited to 'man/event-quick-child.c')
-rw-r--r--man/event-quick-child.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/man/event-quick-child.c b/man/event-quick-child.c
new file mode 100644
index 0000000000..16cc6cf3a4
--- /dev/null
+++ b/man/event-quick-child.c
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: CC0-1.0 */
+
+#include <assert.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sd-event.h>
+
+int main(int argc, char **argv) {
+ pid_t pid = fork();
+ assert(pid >= 0);
+
+ /* SIGCHLD signal must be blocked for sd_event_add_child to work */
+ sigset_t ss;
+ sigemptyset(&ss);
+ sigaddset(&ss, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &ss, NULL);
+
+ if (pid == 0) /* child */
+ sleep(1);
+
+ else { /* parent */
+ sd_event *e = NULL;
+ int r;
+
+ /* Create the default event loop */
+ sd_event_default(&e);
+ assert(e);
+
+ /* We create a floating child event source (attached to 'e').
+ * The default handler will be called with 666 as userdata, which
+ * will become the exit value of the loop. */
+ r = sd_event_add_child(e, NULL, pid, WEXITED, NULL, (void*) 666);
+ assert(r >= 0);
+
+ r = sd_event_loop(e);
+ assert(r == 666);
+
+ sd_event_unref(e);
+ }
+
+ return 0;
+}