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)