aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--miscutils/setsid.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/miscutils/setsid.c b/miscutils/setsid.c
index ad2c8a4de..637081b6c 100644
--- a/miscutils/setsid.c
+++ b/miscutils/setsid.c
@@ -31,7 +31,17 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
/* setsid() is allowed only when we are not a process group leader.
* Otherwise our PID serves as PGID of some existing process group
- * and cannot be used as PGID of a new process group. */
+ * and cannot be used as PGID of a new process group.
+ *
+ * Example: setsid() below fails when run alone in interactive shell:
+ * $ setsid PROG
+ * because shell's child (setsid) is put in a new process group.
+ * But doesn't fail if shell is not interactive
+ * (and therefore doesn't create process groups for pipes),
+ * or if setsid is not the first process in the process group:
+ * $ true | setsid PROG
+ * or if setsid is executed in backquotes (`setsid PROG`)...
+ */
if (setsid() < 0) {
pid_t pid = fork_or_rexec(argv);
if (pid != 0) {
@@ -43,7 +53,7 @@ int setsid_main(int argc UNUSED_PARAM, char **argv)
* However, the code is larger and upstream
* does not do such trick.
*/
- exit(EXIT_SUCCESS);
+ return EXIT_SUCCESS;
}
/* child */