2009-05-29 19 views
9

Se dice que la llamada al sistema fork crea un clon del proceso de llamada, y luego (normalmente) el proceso secundario emite una llamada al sistema execve para cambiar su imagen y ejecutar un nuevo proceso. ¿Por qué este dos pasos?acerca de fork y execve system call

BTW, ¿qué significa execve?

Respuesta

8

Cada paso es relativamente simple.

En Unix, su proceso tiene dos partes: un área de memoria de solo lectura con el código de la aplicación ("texto") y el área de memoria de lectura-escritura ("datos").

Un tenedor clona el área de lectura y escritura, dejando solo la página de texto. Ahora tiene dos procesos que ejecutan el mismo código. Se diferencian por un valor de registro, el valor de retorno de la horquilla, que separa al padre del niño.

Un ejecutivo reemplaza la página de texto, dejando solo la página de datos. Existen muchas formas de ejecución, dependiendo de la cantidad de información del entorno que le envíe. Consulte http://linux.die.net/man/3/exec para obtener una lista adicional de variantes.

+0

Realmente, no puedes hacer nada mal con fork(), ya que no tiene ningún argumento. ¿Puede ser más simple? – 0x6adb015

+6

Umm, exec reemplaza todo el mm, no solo el "texto" ... vea /usr/src/linux/fs/exec.c y /usr/src/linux/fs/binfmt_elf.c – ephemient

+1

Normalmente, el tenedor no clone el área de datos, pero márquelo como Copiar-Escribir-Escribir (COW) en su lugar. Si el padre o el niño intentaron cambiar los datos, la página se clonará y el padre y el niño terminarán con páginas diferentes. – camh

11
  • exec: Ejecuta nuevo proceso
  • v: el uso de la matriz de argumentos
  • e: especifique así el medio ambiente

Otras variaciones de exec abundan:

int execl(const char *path, const char *arg, ...); 
int execlp(const char *file, const char *arg, ...); 
int execle(const char *path, const char *arg,..., char * const envp[]); 
int execv(const char *path, char *const argv[]); 
int execvp(const char *file, char *const argv[]); 
  • l: list arg en la función
  • t: uso $ PATH para localizar el archivo ejecutable
3

El "ejecutivo" familia de funciones en lugar de la imagen de proceso actual (desde donde se le llama) una nueva imagen de proceso con, por lo que la imagen que llama se sustituye por el nueva imagen de proceso. Por ej. si tuviera que ejecutar el comando 'ls' desde un shell (/ bin/sh o/bin/csh), entonces el shell pasaría a un nuevo proceso que luego ejecutaría ls. Una vez que sale el comando ls, devuelve el control al proceso principal, que en este ejemplo es el shell.

Si no hubiera funcionalidad de horquilla, entonces la carcasa sería reemplazada por el proceso 'ls' que al salir le dejaría con un terminal inaccesible ya que la imagen del caparazón en memoria se reemplazó al ejecutar la llamada a ls.

Para ver las variaciones en el aspecto de la familia 'exec', responda 0x6adb015.

14

El motivo de los dos pasos es la flexibilidad. Entre los dos pasos, puede modificar el contexto del proceso secundario que heredará el programa recién ejecutado.

Algunas cosas que usted puede cambiar son:

  • descriptores de archivo de ID
  • usuario/grupo
  • grupo y los identificadores de sesión
  • Proceso
  • directorio
  • Los límites de recursos actuales
  • Programación prioridad y afinidad
  • Máscara de creación de archivos (Umask)

Si no dividir tenedor y exec y en su lugar había una sola llamada desovar sistema similar, tendría que tomar argumentos para cada uno de estos atributos de proceso si quería a establecer de manera diferente en un niño proceso. Por ejemplo, vea la lista de argumentos para CreateProcess en la API de Windows.

Con fork/exec, cambia los atributos de proceso heredables que desee en el elemento secundario antes de ejecutar el nuevo programa.

La configuración de los descriptores de archivos es una de las cosas más comunes para cambiar en el contexto del proceso de un niño. Si desea capturar la salida de un programa, normalmente creará una tubería en el padre con la llamada al sistema pipe (2), y después de la bifurcación (2) ing, cerrará el final de escritura en el proceso principal y cerrará el read end en el proceso hijo antes de llamar a execve (2). (También usará dup (2) para configurar el extremo hijo de la tubería para que sea el descriptor de archivo 1 (stdout)). Esto sería imposible o restrictivo en una sola llamada al sistema.

+0

+1. Me preguntaba a qué te refieres con que "necesitaría tomar argumentos para cada uno de estos atributos de proceso si quisieras que se configuraran de manera diferente en un proceso secundario". – Tim

+0

¿Hay algún código de ejemplo para ilustrar los cambiantes vagos w y sin dividir fork y exec, para mostrar cuál es más flexible? – Tim

+0

@Tim: consulte http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx para ver un ejemplo, y vea que la lista de argumentos en esa llamada a función no cubre todo lo que se menciona encima. – camh

Cuestiones relacionadas