diff options
-rw-r--r-- | man3/system.3 | 63 |
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), |