reaper: monitor SIGCHLD using the FDM instead of via a signalfd

In addition to letting the FDM do the low-level signal watching, this
patch also fixes a bug; multiple SIGCHLDs, be it delivered either through a
signal, or via a signalfd, can be coalesced, like all signals.

This means we need to loop on waitpid() with WNOHANG until there are
no more processes to reap.

This in turn requires a small change to the way reaper callbacks are
implemented.

Previously, the callback was allowed to do the wait(). This was
signalled back to the reaper through the callback’s return value.

Now, since we’ve already wait():ed, the process’ exit status is passed
as an argument to the reaper callback.

The callback for the client application has been updated accordingly;
it sets a flag in the terminal struct, telling term_destroy() that the
process has already been wait():ed on, and also stores the exit
status.
This commit is contained in:
Daniel Eklöf 2021-02-10 16:22:51 +01:00
parent 34699ad3b2
commit 23bc3b2179
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
4 changed files with 91 additions and 139 deletions

View file

@ -10,7 +10,8 @@ struct reaper;
struct reaper *reaper_init(struct fdm *fdm);
void reaper_destroy(struct reaper *reaper);
typedef bool (*reaper_cb)(struct reaper *reaper, pid_t pid, void *data);
typedef void (*reaper_cb)(
struct reaper *reaper, pid_t pid, int status, void *data);
void reaper_add(struct reaper *reaper, pid_t pid, reaper_cb cb, void *cb_data);
void reaper_del(struct reaper *reaper, pid_t pid);