First, don't require blocking SIGCHLD for WEXITED. We watch for WEXITED via pidfd instead of signalfd, so no need to insist on blocking SIGCHLD anymore if we're only watching for WEXITED. Second, do a proper check to see if the kernel autoreaping logic is enabled. That has nothing to do with SIGCHLD being blocked for the current thread or not. Instead, the kernel autoreaping logic is enabled either if the disposition is set to SIG_IGN or if the SA_NOCLDWAIT flag is enabled.
38 lines
787 B
C
38 lines
787 B
C
/* SPDX-License-Identifier: MIT-0 */
|
|
|
|
#define _GNU_SOURCE 1
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <systemd/sd-event.h>
|
|
|
|
int main(int argc, char **argv) {
|
|
pid_t pid = fork();
|
|
assert(pid >= 0);
|
|
|
|
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;
|
|
}
|