2010-05-23 24 views
6

Necesito ejecutar un archivo cuando solo conozco el descriptor. También es posible que no haya enlaces al archivo, por lo que descubrir el nombre de alguna manera no es una opción. Todas las funciones execve(), execvp(), etc. toman un nombre de archivo. dlopen() también toma un nombre.¿Cómo ejecutar un programa desde el descriptor de archivo?

Las soluciones feos (como leer el archivo y llamar a algún puntero de función) están bien.

Respuesta

7

Use fexecve.

PD: leer el archivo y llamar a algún puntero a la función es definitivamente no OK. :)

+0

Quiero decir que está bien si no hay soluciones simples. No haré eso si puedo llamar a fexecve(). Gracias. – stribika

+0

Si no fueras compatible con fexecve, podrías hacer algunas cosas horribles con mmap y libelf, como crear un fdlopen. Eso apestaría, sin embargo. Sin embargo, me alegra aprender sobre fexecve. Me lo he preguntado, pero nunca lo había visto antes, y nunca TENÍA que tenerlo. – nategoose

+1

también puede usar los archivos/dev/fd/n o/proc/self/fd/n, simplemente reemplace n con el número de archivo y páselo a una llamada ejecutiva normal. Así es como lo hace fexecve bajo el capó. –

1

Interesante. Creo que su mejor opción será usar el FD que tiene que escribir un archivo temporal y luego ejecutarlo usando una llamada de ejecutivo normal.

Puede usar mkstemp para hacer un nombre de archivo único garantizado. Luego lea el contenido de su descriptor de archivo y vacíelo al archivo temporal. Luego use el nombre que le dio mkstemp en una llamada de ejecutivo.

Si por algún motivo no desea escribir un archivo nuevo, creo que su única otra opción será analizar manualmente la imagen del archivo exe, cargarla correctamente en la memoria y luego llamar a su función main() . Eso duplica la funcionalidad que ya existe en el sistema operativo, y no creo que quieras hacerlo. Será difícil acertar, y no parece valer la pena el esfuerzo.

Cuestiones relacionadas