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.
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)