.\" (c) 1993 by Thomas Koenig (ig25@rz.uni-karlsruhe.de) .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are .\" preserved on all copies. .\" .\" Permission is granted to copy and distribute modified versions of this .\" manual under the conditions for verbatim copying, provided that the .\" entire resulting derived work is distributed under the terms of a .\" permission notice identical to this one .\" .\" Since the Linux kernel and libraries are constantly changing, this .\" manual page may be incorrect or out-of-date. The author(s) assume no .\" responsibility for errors or omissions, or for damages resulting from .\" the use of the information contained herein. The author(s) may not .\" have taken the same level of care in the production of this manual, .\" which is licensed free of charge, as they might when working .\" professionally. .\" .\" Formatted or processed versions of this manual, if unaccompanied by .\" the source, must acknowledge the copyright and authors of this work. .\" License. .\" Modified Sat Jul 24 17:51:15 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 11 May 1998 by Joseph S. Myers (jsm28@cam.ac.uk) .\" Modified 14 May 2001, 23 Sep 2001 by aeb .\" .\" Translated into Spanish Thu Mar 12 15:34:37 CET 1998 by Gerardo .\" Aburruzaga García .\" Translation revised Wed Aug 19 1998 by Juan Piernas .\" Traducción revisada por Miguel Pérez Ibars el 21-enero-2005 .\" .TH SYSTEM 3 "23 septiembre 2001" "" "Manual del Programador de Linux" .SH NOMBRE system \- ejecuta una orden del intérprete de órdenes (shell) .SH SINOPSIS .nf .B #include .sp .BI "int system(const char *" "string" ); .fi .SH DESCRIPCIÓN .B system() ejecuta una orden especificada en .I string llamando a .BR "/bin/sh -c" .IR string , y regresa después de que la orden se haya terminado de ejecutar. Durante la ejecucion de la orden, se bloqueará .B SIGCHLD y no se hace caso de las señales .B SIGINT ni .BR SIGQUIT . .SH "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 .BR wait (2). Así, el código de salida de la orden será .IR WEXITSTATUS(status) . En caso de que .B "/bin/sh" no pudiera ejecutarse, el estado de salida será el de una orden que haga .IR exit(127) . Si el valor de .I string es .BR NULL , .B system() devuelve un número distinto de cero si hay un intérprete de órdenes disponible, y cero si no. .PP .B system() no afecta al estado de espera de cualquier otro proceso hijo. .SH "CONFORME A" C ANSI, POSIX.2, BSD 4.3 .SH OBSERVACIONES .PP Como se mencionó, .B 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. .br .nf while(algo) { int ret = system("foo"); if (WIFSIGNALED(ret) && (WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT)) break; } .fi .PP No llame a .B 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 .BR exec (3), salvo .BR execlp (3) o .BR execvp (3). .B system() , de hecho, no funcionará apropiadamente desde programas con privilegios suid o sgid en sistemas donde .B /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 .BR sh .) .PP En realidad no se comprueba si el intérprete de órdenes .B /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. .PP 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 .B execve() haya fallado. .SH "VÉASE TAMBIÉN" .BR sh (1), .BR signal (2), .BR wait (2), .BR exec (3)