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.