En POSIX cuando un proceso multiproceso se bifurca, el proceso secundario se ve exactamente como una copia del elemento primario, pero en el que todos los hilos se detenían y desaparecían.
Esto es muy malo si los hilos están sosteniendo bloqueos.
Por esta razón, hay un mecanismo tosco llamado pthread_atfork
en el que puede registrar manejadores para esta situación.
Cualquier módulo de programa correctamente escrito (y especialmente el middleware reutilizable) que usa mutexes debe llamar al pthread_atfork
para registrar algunos manejadores, para que no se comporte mal si el proceso llama al fork
.
Además de los bloqueos mutex, los subprocesos podrían tener otros recursos, como datos específicos de subprocesos escondidos con pthread_setspecific
, que solo son accesibles para el subproceso (y el subproceso es responsable de limpiarlo mediante un destructor).
En el proceso secundario, no se ejecuta dicho destructor. El espacio de direcciones se copia, pero el subproceso y su valor específico de subproceso no está allí, por lo que la memoria se filtra en el elemento secundario. Esto puede y debe ser manejado con controladores pthread_atfork
también.
Como ya habrán dado cuenta por ahora, esta es una muy mala idea. Si tiene este tipo de inquietudes en una aplicación real, le sugiero que averigüe la razón por la que debe hacer eso, descubra cómo hacerlo de la manera correcta y realice una refactorización adecuada: D – Dacav