Provided by: manpages-es_1.55-10_all bug

NOMBRE

       system - ejecuta una orden del intérprete de órdenes (shell)

SINOPSIS

       #include <stdlib.h>

       int system(const char *string);

DESCRIPCIÓN

       system()  ejecuta una orden especificada en string llamando a /bin/sh -c string, y regresa después de que
       la orden se haya terminado de ejecutar.  Durante la ejecucion de la orden, se bloqueará SIGCHLD y  no  se
       hace caso de las señales SIGINT ni SIGQUIT.

VALOR DEVUELTO

       El  valor  devuelto  es  -1  en caso de error (p.e. falló la llamada a fork), y el estado devuelto por la
       orden en caso contrario.  Este último valor está en el formato especificado en wait(2).  Así,  el  código
       de  salida de la orden será WEXITSTATUS(status).  En caso de que /bin/sh no pudiera ejecutarse, el estado
       de salida será el de una orden que haga exit(127).  Si el valor de string es NULL, system()  devuelve  un
       número distinto de cero si hay un intérprete de órdenes disponible, y cero si no.

       system() no afecta al estado de espera de cualquier otro proceso hijo.

CONFORME A

       C ANSI, POSIX.2, BSD 4.3

OBSERVACIONES

       Como se mencionó, system() ignora SIGINT y SIGQUIT. Esto puede hacer que los programas que invocan a esta
       función  desde  un  bucle  sean  ininterrumpibles,  a menos que se preocupen ellos mismos de comprobar el
       estado de salida del hijo. P.e.

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

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

       No llame a system() desde un programa con privilegios suid o sgid, porque pudiera ser  que  se  emplearan
       valores  extraños  para  algunas  variables de entorno para comprometer la integridad del sistema.  En su
       lugar emplee la familia de funciones exec(3), salvo execlp(3) o  execvp(3).   system()  ,  de  hecho,  no
       funcionará  apropiadamente  desde  programas con privilegios suid o sgid en sistemas donde /bin/sh sea la
       versión 2 de bash, puesto que bash 2 elimina los privilegios en el arranque.   (Debian  usa  una  versión
       modificada de bash que no hace ésto cuando es invocado como sh.)

       En realidad no se comprueba si el intérprete de órdenes /bin/sh está disponible o no; en Linux siempre se
       supone  que  lo  está.  ISO  C  especifica la comprobación, pero POSIX.2 especifica que el valor devuelto
       siempre será no cero, ya que un sistema sin intérprete de órdenes no es conforme, y esto  es  lo  que  se
       implementa.

       Es  posible que una orden del intérprete de órdenes devuelva 127, así que ese código no es una indicación
       segura de que execve() haya fallado.

VÉASE TAMBIÉN

       sh(1), signal(2), wait(2), exec(3)

                                               23 septiembre 2001                                      SYSTEM(3)