summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man3/system.363
1 files changed, 40 insertions, 23 deletions
diff --git a/man3/system.3 b/man3/system.3
index add7bc6d..795c53ff 100644
--- a/man3/system.3
+++ b/man3/system.3
@@ -23,23 +23,24 @@
.\" Modified Sat Jul 24 17:51:15 1993 by Rik Faith (faith@cs.unc.edu)
.\" Modified 11 May 1998 by Joseph S. Myers (jsm28@cam.ac.uk)
.\" Modified 14 May 2001, 23 Sep 2001 by aeb
+.\" 2004-12-20, mtk
.\"
-.TH SYSTEM 3 2001-09-23 "" "Linux Programmer's Manual"
+.TH SYSTEM 3 2004-12-20 "" "Linux Programmer's Manual"
.SH NAME
system \- execute a shell command
.SH SYNOPSIS
.nf
.B #include <stdlib.h>
.sp
-.BI "int system(const char *" "string" );
+.BI "int system(const char *" "command" );
.fi
.SH DESCRIPTION
-.B system()
+.BR system ()
executes a command specified in
-.I string
+.I command
by calling
.BR "/bin/sh -c"
-.IR string ,
+.IR command ,
and returns after the command has been completed.
During execution of the command,
.B SIGCHLD
@@ -57,26 +58,34 @@ specified in
Thus, the exit code of the command will be
.IR WEXITSTATUS(status) .
In case
-.B "/bin/sh"
+.I "/bin/sh"
could not be executed, the exit status will be that of
a command that does
.IR exit(127) .
.PP
If the value of
-.I string
+.I command
is
.BR NULL ,
-.B system()
+.BR system ()
returns nonzero if the shell is available, and zero if not.
.PP
-.B system()
+.BR system ()
does not affect the wait status of any other children.
.SH "CONFORMING TO"
ANSI C, POSIX.2, BSD 4.3
.SH NOTES
.PP
+If the
+.B _XOPEN_SOURCE
+feature test macro is defined, then the macros described in
+.BR wait (2)
+.RB ( WEXITSTATUS() ,
+etc.) are made available when including
+.IR <stdlib.h> .
+.PP
As mentioned,
-.B system()
+.BR system ()
ignores SIGINT and SIGQUIT. This may make programs that call it
from a loop uninterruptable, unless they take care themselves
to check the exit status of the child. E.g.
@@ -93,33 +102,41 @@ to check the exit status of the child. E.g.
.fi
.PP
Do not use
-.B system()
-from a program with suid or sgid privileges, because strange values for
-some environment variables might be used to subvert system integrity.
+.BR system ()
+from a program with set-UID or set-GID privileges,
+because strange values for some environment variables
+might be used to subvert system integrity.
Use the
.BR exec (3)
family of functions instead, but not
.BR execlp (3)
or
.BR execvp (3).
-.B system()
-will not, in fact, work properly from programs with suid or sgid
+.BR system ()
+will not, in fact, work properly from programs with set-UID or set-GID
privileges on systems on which
-.B /bin/sh
+.I /bin/sh
is bash version 2, since bash 2 drops privileges on startup.
(Debian uses a modified bash which does not do this when invoked as
.BR sh .)
.PP
-The check for the availability of
-.B /bin/sh
-is not actually performed; it is always assumed to be available. ISO
-C specifies the check, but POSIX.2 specifies that the return shall
-always be non-zero, since a system without the shell is not
-conforming, and it is this that is implemented.
+In versions of glibc before 2.1.3, the check for the availability of
+.I /bin/sh
+was not actually performed if
+.I command
+was NULL; instead it was always assumed to be available, and
+.BR system ()
+always returned 1 in this case.
+Since glibc 2.1.3, this check is performed because, even though
+POSIX.1-2001 requires a conforming implementation to provide
+a shell, that shell may not be available or executable if
+the calling program has previously called
+.BR chroot (2)
+(which is not specified by POSIX.1-2001).
.PP
It is possible for the shell command to return 127, so that code is not
a sure indication that the
-.B execve()
+.BR execve ()
call failed.
.SH "SEE ALSO"
.BR sh (1),