diff options
-rw-r--r-- | miscutils/setsid.c | 14 |
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 */ |