1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
|
.\" 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 <esr@thyrsus.com>
.\" Modificado Mon Jul 21 03:29:34 1997 por Nicolás Lichtmaier <nick@debian.or
.\" Translation revised 21 April 1998 by Juan Piernas <piernas@dif.um.es>
.\" Modified Fri Nov 12 22:57:27 1999 by Urs Thuermann <urs@isnogud.escape.de>
.\" Translation revised Sat Jan 8 2000 by Juan Piernas <piernas@ditec.um.es>
.\"
.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 <unistd.h>
.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)
|