procesos
Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
procesos [2015/07/07 01:51] – [Hora y Fecha] lmateu | procesos [2018/07/12 14:00] (actual) – [Procesos] lmateu | ||
---|---|---|---|
Línea 8: | Línea 8: | ||
* En el padre, fork retorna el pid del hijo. | * En el padre, fork retorna el pid del hijo. | ||
* Para el hijo se crea un nuevo espacio de direcciones de memoria que parte inicialmente con una copia de toda la memoria del padre. | * Para el hijo se crea un nuevo espacio de direcciones de memoria que parte inicialmente con una copia de toda la memoria del padre. | ||
- | * El hijo hereda | + | * El hijo hereda todos los archivos abiertos por el padre. Los fds (file descriptors) del padre siguen siendo válidos en el hijo (y también en el padre). |
* El tiempo de ejecución del proceso hijo parte de 0. | * El tiempo de ejecución del proceso hijo parte de 0. | ||
* El hijo parte sin alarmas ni señales pendientes. | * El hijo parte sin alarmas ni señales pendientes. | ||
Línea 17: | Línea 17: | ||
#include < | #include < | ||
| | ||
- | pid_t child; | + | pid_t child= fork(); |
- | if ((child= | + | if (child==0) { |
- | /* aquí se ejecuta el padre */ | + | // aquí se ejecuta el hijo |
- | | + | |
- | ... | + | |
} | } | ||
else { | else { | ||
- | /* aquí se ejecuta el hijo */ | + | // aquí se ejecuta el padre |
- | ... | + | |
+ | ... código que se ejecuta en paralelo con el cuerpo del hijo ... | ||
+ | int status; | ||
+ | waitpid(child, | ||
+ | int rc= WEXITSTATUS(status); | ||
} | } | ||
+ | </ | ||
+ | |||
+ | ==== Formas de terminar un proceso ==== | ||
+ | |||
+ | ^ mecanismo ^ notas ^ | ||
+ | | return del main | Si el valor retornado de 0 se considera que el fin fue exitoso | | ||
+ | | exit(value); | ||
+ | | abort(); | El efecto de esta última llamada es indefinido, pero puede generar un core | | ||
+ | |||
+ | Para matar a otro proceso se usa: | ||
+ | |||
+ | < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | pid_t pid; | ||
+ | kill(pid, SIGKILL); | ||
</ | </ | ||
Línea 62: | Línea 83: | ||
Los flags incluyen como valor posible WNOHANG que hace que la llamada no se bloquee. | Los flags incluyen como valor posible WNOHANG que hace que la llamada no se bloquee. | ||
- | |||
- | ==== Formas de terminar un proceso ==== | ||
- | |||
- | ^ mecanismo ^ notas ^ | ||
- | | return del main | Si el valor retornado de 0 se considera que el fin fue exitoso | | ||
- | | exit(value); | ||
- | | abort(); | El efecto de esta última llamada es indefinido, pero puede generar un core | | ||
- | |||
- | Para matar a otro proceso se usa: | ||
- | |||
- | < | ||
- | #include < | ||
- | #include < | ||
- | |||
- | pid_t pid; | ||
- | kill(pid, SIGKILL); | ||
- | </ | ||
==== Deberes del padre ==== | ==== Deberes del padre ==== | ||
Línea 102: | Línea 106: | ||
en donde fds es un arreglo de tamaño 2. Después de ejecutar esta llamada, se obtienen 2 fds: | en donde fds es un arreglo de tamaño 2. Después de ejecutar esta llamada, se obtienen 2 fds: | ||
- | |||
fds[0] permite leer | fds[0] permite leer | ||
Línea 155: | Línea 158: | ||
Observe que si se reemplazara la llamada de la función leer por read, podría funcionar en algunas plataformas, | Observe que si se reemplazara la llamada de la función leer por read, podría funcionar en algunas plataformas, | ||
+ | |||
+ | Cuando user fork nunca olvide: | ||
+ | - Invocar exit para terminar el hijo | ||
+ | - Invocar waitpid en el padre para enterrar al hijo | ||
+ | - Padre e hijo usan espacios de direcciones independientes así es que el padre no verá los cambios que el hijo haya hecho en la memoria. | ||
+ | |||
+ | ==== Ejercicio ==== | ||
+ | |||
+ | Resuelva la pregunta 1 partes a y b del [[http:// | ||
==== Cambiar el archivo ejecutable ==== | ==== Cambiar el archivo ejecutable ==== | ||
Línea 319: | Línea 331: | ||
==== Variables de ambiente ==== | ==== Variables de ambiente ==== | ||
- | El puntero environ apunta a un arreglo de strings de la forma: | + | El puntero environ |
< | < | ||
Línea 345: | Línea 357: | ||
El parámetro //name// apunta al nombre de la variable y //p// recibe el puntero a la línea // | El parámetro //name// apunta al nombre de la variable y //p// recibe el puntero a la línea // | ||
+ | |||
+ | Para el resto de las funciones de la familia exec se preservan las mismas variables de ambiente que regían antes de la llamada a exec. En una llamada a fork, el proceso hijo hereda las mismas variables de ambiente del proceso hijo. Por esta razón al invocar un comando desde el shell, el proceso que se crea heredará las variables de ambiente del shell. | ||
==== Información disponible durante la ejecución ==== | ==== Información disponible durante la ejecución ==== |
procesos.1436233898.txt.gz · Última modificación: 2015/07/07 01:51 por lmateu