summaryrefslogtreecommitdiffstats
path: root/man3/system.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/system.3')
-rw-r--r--man3/system.3128
1 files changed, 128 insertions, 0 deletions
diff --git a/man3/system.3 b/man3/system.3
new file mode 100644
index 000000000..add7bc6d6
--- /dev/null
+++ b/man3/system.3
@@ -0,0 +1,128 @@
+.\" (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de)
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\" License.
+.\" 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
+.\"
+.TH SYSTEM 3 2001-09-23 "" "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" );
+.fi
+.SH DESCRIPTION
+.B system()
+executes a command specified in
+.I string
+by calling
+.BR "/bin/sh -c"
+.IR string ,
+and returns after the command has been completed.
+During execution of the command,
+.B SIGCHLD
+will be blocked, and
+.B SIGINT
+and
+.B SIGQUIT
+will be ignored.
+.SH "RETURN VALUE"
+The value returned is \-1 on error (e.g. fork failed),
+and the return status of the command otherwise.
+This latter return status is in the format
+specified in
+.BR wait (2).
+Thus, the exit code of the command will be
+.IR WEXITSTATUS(status) .
+In case
+.B "/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
+is
+.BR NULL ,
+.B system()
+returns nonzero if the shell is available, and zero if not.
+.PP
+.B system()
+does not affect the wait status of any other children.
+.SH "CONFORMING TO"
+ANSI C, POSIX.2, BSD 4.3
+.SH NOTES
+.PP
+As mentioned,
+.B 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.
+.br
+.nf
+
+ while(something) {
+ int ret = system("foo");
+
+ if (WIFSIGNALED(ret) &&
+ (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
+ break;
+ }
+.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.
+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
+privileges on systems on which
+.B /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.
+.PP
+It is possible for the shell command to return 127, so that code is not
+a sure indication that the
+.B execve()
+call failed.
+.SH "SEE ALSO"
+.BR sh (1),
+.BR signal (2),
+.BR wait (2),
+.BR exec (3)