Provided by: manpages-es_1.55-3_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)