.\" Hey Emacs! This file is -*- nroff -*- source. .\" .\" Copyright (c) 1992 Drew Eckhardt (drew@cs.colorado.edu), March 28, 1992 .\" .\" 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. .\" .\" Modified by Michael Haardt (michael@moria.de) .\" Modified Wed Jul 21 22:47:01 1993 by Rik Faith (faith@cs.unc.edu) .\" Modified 21 Aug 1994 by Michael Chastain (mec@shell.portal.com): .\" Fixed typoes. .\" Translated 22 Dec 1995 Miguel A. Sepulveda (miguel@typhoon.harvard.edu) .\" Modified Fri Jan 31 16:24:28 1997 by Eric S. Raymond .\" Modificado Mon Jul 21 03:29:34 1997 por Nicolás Lichtmaier .\" Modified Fri Nov 12 22:57:27 1999 by Urs Thuermann .\" Translation revised Sat Jan 8 2000 by Juan Piernas .\" .TH EXECVE 2 "3 septiembre 1997" "Linux 2.0.30" "Manual del Programador de Linux" .SH NOMBRE execve \- ejecuta un programa .SH SINOPSIS .B #include .sp .BI "int execve (const char *" filename ", const char *" argv .BI "[], const char *" envp []); .SH DESCRIPCIÓN \fBexecve()\fP ejecuta el programa indicado por \fIfilename\fP. \fIfilename\fP debe ser bien un binario ejecutable, bien un guión shell (shell script) comenzando con una línea de la forma "\fB#! \fIintérprete \fR[arg]". En el segundo caso, el intérprete debe ser un nombre de camino válido para un ejecutable que no sea él mismo un guión y que será ejecutado como \fBintérprete\fR [arg] \fIfilename\fR. \fIargv\fP es un array de cadenas de argumentos pasados al nuevo programa. \fIenvp\fP es un array de cadenas, convencionalmente de la forma \fBclave=valor\fR, que se pasan como entorno al nuevo programa. Tanto \fIargv\fP como \fIenvp\fP deben terminar en un puntero nulo. El vector de argumentos y el entorno pueden ser accedidos por la función "main" del programa invocado cuando se define como \fBint main(int argc, char *argv[], char *envp[])\fR. \fBexecve()\fP no regresa en caso de éxito, y el código, datos, bss y la pila del proceso invocador se reescriben con los correspondientes del programa cargado. El programa invocado hereda el PID del proceso invocador y cualquier descriptor de fichero abierto que no se halla configurado para "cerrar en ejecución" (close on exec). Las señales pendientes del proceso invocador se limpian. Cualquier señal capturada por el proceso invocador es devuelta a su comportamiento por defecto. La señal SIGCHLD (cuando está puesta a SIG_IGN) puede o no puede ser reiniciada a SIG_DFL. Si el programa actual está bajo inspección de ptrace, se le enviará una señal \fBSIGTRAP\fP trás la ejecución exitosa de \fBexecve()\fP. Si el bit "set-uid" está activo en el fichero del programa indicado por \fIfilename\fP, se cambia el ID de usuario efectivo del proceso invocador al del propietario del fichero del programa. De igual forma, cuando el bit "set-gid" del fichero del programa está activo, se cambia el ID del grupo efectivo del proceso invocador al del grupo del fichero del programa. Si el ejecutable es un ejecutable binario a.out enlazado dinámicamente que contiene "stubs" de bibliotecas compartidas, se llama al enlazador dinámico de Linux, .BR ld.so (8), al comienzo de la ejecución para traer al núcleo las bibliotecas compartidas necesarias y enlazar el ejecutable con ellas. Si el ejecutable es un ejecutable ELF enlazado dinámicamente, se usa el intérprete especificado en el segmento PT_INTERP para cargar las bibliotecas compartidas necesarias. Este intérprete es usualmente \fI/lib/ld-linux.so.1\fR para los binarios enlazados con la versión 5 de la libc de Linux o \fI/lib/ld-linux.so.2\fR para los binarios enlazados con la versión 2 de la libc de GNU. .SH "VALOR DEVUELTO" En caso de éxito \fBexecve()\fP no regresa mientras que en caso de error el valor devuelto es \-1, y a la variable .I errno se le asigna un valor apropiado. .SH ERRORES .TP .B EACCES El fichero o el intérprete de guiones no es un fichero regular. .TP .B EACCES Se ha denegado el permiso de ejecución para el fichero o para el intérprete de guiones o el intérprete ELF. .TP .B EACCES El sistema de ficheros está montado con la opción .IR noexec . .TP .B EPERM El sistema de ficheros está montado con la opción .IR nosuid , el usuario no es el superusuario y el fichero tiene activo el bit SUID o SGID. .TP .B EPERM El proceso está siendo ejecutado paso a paso, el usuario no es el superusuario y el fichero tiene activo el bit SUID o SGID. .TP .B E2BIG La lista de argumentos es demasiado grande. .TP .B ENOEXEC El ejecutable no se encuentra en un formato reconocible, es para una arquitectura incorrecta o tiene algún otro error de formato que impide su ejecución. .TP .B EFAULT .I filename apunta fuera de su espacio de direcciones accesible. .TP .B ENAMETOOLONG .I filename es demasiado largo. .TP .B ENOENT El fichero .I filename no existe o no existe un intérprete de guiones o un intérprete ELF, o no pudo encontrarse una biblioteca compartida necesitada por el fichero o el intérprete. .TP .B ENOMEM No hay suficiente memoria disponible en el núcleo. .TP .B ENOTDIR Un componente del camino .I filename o del camino del intérprete de guiones o del intérprete ELF no es un directorio. .TP .B EACCES Se ha denegado el permiso de búsqueda en uno de los componentes del camino .I filename o del camino del intérprete de guiones. .TP .B ELOOP Se han econtrado demasiados enlaces simbólicos al resolver .IR filename , el nombre del intérprete de guiones o el nombre del intérprete ELF. .TP .B ETXTBSY Uno o más procesos han abierto el ejecutable para escritura. .TP .B EIO Se ha producido un error de E/S. .TP .B ENFILE Se ha alcanzado el límite del número total de ficheros abiertos en el sistema. .TP .B EMFILE El proceso ya tiene abiertos el número máximo de fichero. .TP .B EINVAL El ejecutable ELF tiene más de un segmento PT_INTERP (es decir, ha intentado especificar más de un intérprete). .TP .B EISDIR El intérprete ELF es un directorio. .TP .B ELIBBAD El intérprete ELF no está en un formato reconocible. .SH "CONFORME A" SVr4, SVID, X/OPEN y BSD 4.3. POSIX no documenta el significado de #! pero, en cualquier caso, es compatible. SVr4 documenta las condiciones de error adicionales EAGAIN, EINTR, ELIBACC, ENOLINK y EMULTIHOP; POSIX no documenta las condiciones de error ETXTBSY, EPERM, EFAULT, ELOOP, EIO, ENFILE, EMFILE, EINVAL, EISDIR ni ELIBBAD. .SH OBSERVACIONES Procesos SUID y SGID no pueden ser inspeccionados con \fBptrace()\fP. Linux ignora los bits SUID y SGID en los guiones shell. El resultado de montar un sistema de ficheros con la opción .I nosuid varía entre las distintas versiones del núcleo Linux: algunas se negarán a ejecutar ejecutables con los bits SUID/SGID cuando ésto pudiera dar al usuario poderes que no tenía antes (devolviendo EPERM), otras simplemente ignorarán los bits SUID/SGID y los ejecutarán sin más. La longitud máxima de línea en un ejecutable del tipo #! es de 127 caracteres en la primera línea del fichero. .\" .SH FALLOS .\" Algunas versiones de Linux fallan al comprobar los permisos en los .\" intérpretes ELF. Esto es un agujero de seguridad, porque permite a los .\" usuarios abrir cualquier fichero, como un dispositivo de cinta rebobinable, .\" para lectura. Algunas versiones de Linux han tenido también otros agujeros .\" de seguridad en \fBexecve()\fP, que podían ser aprovechados para denegación de .\" servicio por binarios ELF debidamente manipulados. No hay problemas .\" conocidos con las versiones del núcleo 2.0.34 ó 2.2.15. .SH "VÉASE TAMBIÉN" .BR chmod (2), .BR fork (2), .BR execl (3), .BR environ (5), .BR ld.so (8)