Add an option to save the child's pid into a file. Marc. diff -NRapruz -X /etc/diff.excludes util-linux-2.40.4/sys-utils/setsid.1.adoc devel-2.40.4/sys-utils/setsid.1.adoc --- util-linux-2.40.4/sys-utils/setsid.1.adoc +++ devel-2.40.4/sys-utils/setsid.1.adoc @@ -31,6 +31,9 @@ Always create a new process. *-w*, *--wait*:: Wait for the execution of the program to end, and return the exit status of this program as the exit status of *setsid*. +*-p*, *--pidfile* _file_:: +If forked, write the process id of the program to _file_. + *-V*, *--version*:: Display version information and exit. diff -NRapruz -X /etc/diff.excludes util-linux-2.40.4/sys-utils/setsid.c devel-2.40.4/sys-utils/setsid.c --- util-linux-2.40.4/sys-utils/setsid.c +++ devel-2.40.4/sys-utils/setsid.c @@ -14,6 +14,9 @@ * * 2008-08-20 Daniel Kahn Gillmor <dkg@xxxxxxxxxxxxxxxxx> * - if forked, wait on child process and emit its return code. + * + * 2025-01-25 Marc Aurèle La France <tsi@xxxxxxxxxx> + * - If forked, save the child's process id in a file. */ #include <getopt.h> #include <stdio.h> @@ -39,11 +42,12 @@ static void __attribute__((__noreturn__)) usage(void) fputs(_("Run a program in a new session.\n"), out); fputs(USAGE_OPTIONS, out); - fputs(_(" -c, --ctty set the controlling terminal to the current one\n"), out); - fputs(_(" -f, --fork always fork\n"), out); - fputs(_(" -w, --wait wait program to exit, and use the same return\n"), out); + fputs(_(" -c, --ctty set the controlling terminal to the current one\n"), out); + fputs(_(" -f, --fork always fork\n"), out); + fputs(_(" -w, --wait wait program to exit, and use the same return\n"), out); + fputs(_(" -p, --pidfile <file> write child pid to <file>\n"), out); - fprintf(out, USAGE_HELP_OPTIONS(16)); + fprintf(out, USAGE_HELP_OPTIONS(26)); fprintf(out, USAGE_MAN_TAIL("setsid(1)")); exit(EXIT_SUCCESS); @@ -55,14 +59,17 @@ int main(int argc, char **argv) int ctty = 0; pid_t pid; int status = 0; + const char *pidpath = NULL; + FILE *pidfile; static const struct option longopts[] = { - {"ctty", no_argument, NULL, 'c'}, - {"fork", no_argument, NULL, 'f'}, - {"wait", no_argument, NULL, 'w'}, - {"version", no_argument, NULL, 'V'}, - {"help", no_argument, NULL, 'h'}, - {NULL, 0, NULL, 0} + {"ctty", no_argument, NULL, 'c'}, + {"fork", no_argument, NULL, 'f'}, + {"wait", no_argument, NULL, 'w'}, + {"pidfile", required_argument, NULL, 'p'}, + {"version", no_argument, NULL, 'V'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} }; setlocale(LC_ALL, ""); @@ -70,7 +77,7 @@ int main(int argc, char **argv) textdomain(PACKAGE); close_stdout_atexit(); - while ((ch = getopt_long(argc, argv, "+Vhcfw", longopts, NULL)) != -1) + while ((ch = getopt_long(argc, argv, "+Vhcfp:w", longopts, NULL)) != -1) switch (ch) { case 'c': ctty=1; @@ -81,6 +88,9 @@ int main(int argc, char **argv) case 'w': status = 1; break; + case 'p': + pidpath = optarg; + break; case 'h': usage(); @@ -105,6 +115,16 @@ int main(int argc, char **argv) break; default: /* parent */ + if (pidpath) { + pidfile = fopen(pidpath, "w"); + if (pidfile == NULL) + warn(_("cannot open pidfile %s"), + pidpath); + else { + fprintf(pidfile, "%d\n", pid); + fclose(pidfile); + } + } if (!status) return EXIT_SUCCESS; if (wait(&status) != pid)