bionic (2) execve.2.gz

Provided by: manpages-es_1.55-10_all bug

NOMBRE

       execve - ejecuta un programa

SINOPSIS

       #include <unistd.h>

       int execve (const char *filename, const char *argv [], const char *envp[]);

DESCRIPCIÓN

       execve()  ejecuta  el programa indicado por filename.  filename debe ser bien un binario ejecutable, bien
       un guión shell (shell script) comenzando con una línea de la forma "#! intérprete [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 intérprete [arg] filename.

       argv es un array de cadenas de argumentos pasados al nuevo  programa.   envp  es  un  array  de  cadenas,
       convencionalmente  de la forma clave=valor, que se pasan como entorno al nuevo programa.  Tanto argv como
       envp 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  int main(int argc, char *argv[], char
       *envp[]).

       execve() 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  SIGTRAP trás la ejecución
       exitosa de execve().

       Si el bit "set-uid" está activo en el fichero del programa indicado por filename,  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, 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
       /lib/ld-linux.so.1  para los binarios enlazados con la versión 5 de la libc de Linux o /lib/ld-linux.so.2
       para los binarios enlazados con la versión 2 de la libc de GNU.

VALOR DEVUELTO

       En caso de éxito execve() no regresa mientras que en caso de error el  valor  devuelto  es  -1,  y  a  la
       variable errno se le asigna un valor apropiado.

ERRORES

       EACCES El fichero o el intérprete de guiones no es un fichero regular.

       EACCES Se  ha  denegado  el  permiso  de  ejecución  para el fichero o para el intérprete de guiones o el
              intérprete ELF.

       EACCES El sistema de ficheros está montado con la opción noexec.

       EPERM  El sistema de ficheros está montado con la opción nosuid, el usuario no es el  superusuario  y  el
              fichero tiene activo el bit SUID o SGID.

       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.

       E2BIG  La lista de argumentos es demasiado grande.

       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.

       EFAULT filename apunta fuera de su espacio de direcciones accesible.

       ENAMETOOLONG
              filename es demasiado largo.

       ENOENT El  fichero 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.

       ENOMEM No hay suficiente memoria disponible en el núcleo.

       ENOTDIR
              Un componente del camino filename o del camino del intérprete de guiones o del intérprete  ELF  no
              es un directorio.

       EACCES Se  ha  denegado el permiso de búsqueda en uno de los componentes del camino filename o del camino
              del intérprete de guiones.

       ELOOP  Se han econtrado demasiados enlaces simbólicos al resolver filename, el nombre del  intérprete  de
              guiones o el nombre del intérprete ELF.

       ETXTBSY
              Uno o más procesos han abierto el ejecutable para escritura.

       EIO    Se ha producido un error de E/S.

       ENFILE Se ha alcanzado el límite del número total de ficheros abiertos en el sistema.

       EMFILE El proceso ya tiene abiertos el número máximo de fichero.

       EINVAL El ejecutable ELF tiene más de un segmento PT_INTERP (es decir, ha intentado especificar más de un
              intérprete).

       EISDIR El intérprete ELF es un directorio.

       ELIBBAD
              El intérprete ELF no está en un formato reconocible.

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.

OBSERVACIONES

       Procesos SUID y SGID no pueden ser inspeccionados con ptrace().

       Linux ignora los bits SUID y SGID en los guiones shell.

       El  resultado  de  montar un sistema de ficheros con la opción 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.

VÉASE TAMBIÉN

       chmod(2), fork(2), execl(3), environ(5), ld.so(8)