system (3)





NAME

       system - execute a shell command


SYNOPSIS

       #include <stdlib.h>

       int system(const char *string);


DESCRIPTION

       system()  executes  a command specified in string by calling /bin/sh -c
       string, and returns after the command has been completed.  During  exe-
       cution  of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT
       will be ignored.


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 wait(2).  Thus, the exit code of the  command  will
       be  WEXITSTATUS(status).   In  case  /bin/sh could not be executed, the
       exit status will be that of a command that does exit(127).

       If the value of string is NULL, system() returns nonzero if  the  shell
       is available, and zero if not.

       system() does not affect the wait status of any other children.


CONFORMING TO

       ANSI C, POSIX.2, BSD 4.3


NOTES

       As  mentioned, system() ignores SIGINT and SIGQUIT.  This may make pro-
       grams that call it from a loop uninterruptable, unless they  take  care
       themselves to check the exit status of the child. E.g.

           while(something) {
               int ret = system("foo");

               if (WIFSIGNALED(ret) &&
                   (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
                       break;
           }

       Do  not  use  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 exec(3) family of functions instead,
       but not execlp(3) or execvp(3).  system() will not, in fact, work prop-
       erly  from  programs  with  suid or sgid privileges on systems on which
       /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
       sh.)

       The check for the availability of /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

                                  2001-09-23                         system(3)