runbg: new helper function inspired by the Infix project

The runbg() function is a delayed execvp() that has double-forked to the
background (to not create zombies).  It is useful for running commands
in the background for APIs that need to return a reply, e.g. a NETCONF
RPC to reboot the system.

Compared to the original in Infix, this version double forks to reparent
itself to PID 1 (init), closes all open files, including stdio.

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2023-09-17 11:00:09 +02:00
1 parent 921afdecb4
commit 92bb0ca399
7 files changed
+135 -3

No files matched your search

+1
View File
@@ -15,6 +15,7 @@
/printhdr
/progress
/rsync
/runbg
/str
/strmatch
/systemf
+1
View File
@@ -30,6 +30,7 @@ TESTS += pidfile
TESTS += printhdr
TESTS += progress
TESTS += rsync
TESTS += runbg
TESTS += str
TESTS += strmatch
TESTS += systemf
+23
View File
@@ -0,0 +1,23 @@
#include "check.h"
#define file "/tmp/runbg.txt"
int main(void)
{
char *cmd[] = {
"sh", "-c", "echo 'hello world' > " file, NULL
};
erase(file);
test(runbg(cmd, 200000), "Calling runbg");
if (test(fexist(file), "Verifying %s does not yet exist", file))
return 1;
test(usleep(300000), "Waiting for runbg");
if (test(!fexist(file), "Verifying %s has been created", file))
return 1;
return 0;
}