setsid: new option --fork

Let's make semantic more predictable.

Addresses: https://github.com/karelzak/util-linux/issues/518
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2017-11-08 11:38:26 +01:00
parent a85c390134
commit 1801762130
2 changed files with 14 additions and 5 deletions

View File

@ -12,13 +12,17 @@ setsid \- run a program in a new session
.B setsid
runs a program in a new session. The command calls
.BR fork (2)
if already a process group leader. Otherwise, it executes a program in the
current process.
if already a process group leader. Otherwise, it executes a program in the
current process. This default behavior is possible to override by
the \fB\-\-fork\fR option.
.SH OPTIONS
.TP
.BR \-c , " \-\-ctty"
Set the controlling terminal to the current one.
.TP
.BR \-f , " \-\-fork"
Always create a new process.
.TP
.BR \-w , " \-\-wait"
Wait for the execution of the program to end, and return the exit value of
this program as the return value of

View File

@ -38,6 +38,7 @@ static void __attribute__((__noreturn__)) usage(void)
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);
printf(USAGE_HELP_OPTIONS(16));
@ -48,13 +49,14 @@ static void __attribute__((__noreturn__)) usage(void)
int main(int argc, char **argv)
{
int ch;
int ch, forcefork = 0;
int ctty = 0;
pid_t pid;
int status = 0;
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'},
@ -66,7 +68,7 @@ int main(int argc, char **argv)
textdomain(PACKAGE);
atexit(close_stdout);
while ((ch = getopt_long(argc, argv, "+Vhcw", longopts, NULL)) != -1)
while ((ch = getopt_long(argc, argv, "+Vhcfw", longopts, NULL)) != -1)
switch (ch) {
case 'V':
printf(UTIL_LINUX_VERSION);
@ -74,6 +76,9 @@ int main(int argc, char **argv)
case 'c':
ctty=1;
break;
case 'f':
forcefork = 1;
break;
case 'w':
status = 1;
break;
@ -88,7 +93,7 @@ int main(int argc, char **argv)
errtryhelp(EXIT_FAILURE);
}
if (getpgrp() == getpid()) {
if (forcefork || getpgrp() == getpid()) {
pid = fork();
switch (pid) {
case -1: