Sé que si llamo a la función open antes que fork() , el puntero IO se comparte entre los procesos.
Si uno de estos procesos cierra el archivo llamando a la función close(fd) , ¿seguirán siendo capaces los otros procesos de escribir/leer el archivo o se cerrará el archivo para todos?
Sí. Cada proceso tiene una copia del descriptor del archivo (entre otras cosas). Entonces, un proceso que lo cierra no afectará la copia del fd en otro proceso.
Del manual de la fork() :
El hijo hereda copias del conjunto de descriptores de archivos abiertos del padre. Cada descriptor de archivo en el elemento secundario hace referencia a la misma descripción de archivo abierto (ver open(2)) que el descriptor de archivo correspondiente en el elemento principal. Esto significa que los dos descriptores comparten indicadores de estado de archivo abierto, compensación de archivo actual y atributos de E/S controlados por señal (consulte la descripción de F_SETOWN y F_SETSIG en fcntl(2)).
Del manual close() :
Si fd es el último descriptor de archivo que hace referencia a la descripción de archivo abierto subyacente (consulte open(2)), los recursos asociados con la descripción de archivo abierto se liberan; si el descriptor era la última referencia a un archivo que se eliminó usando unlink(2), el archivo se elimina.
Entonces, si close(fd); cierra solo la referencia en ese proceso y otro proceso que contiene otra referencia al mismo descriptor de archivo puede continuar operando en él.
Cada vez que se crea un proceso secundario, obtiene una copia de la tabla de descriptores de archivos del proceso principal. Y hay un recuento de referencias correspondiente a cada descriptor de archivo, que es el número de procesos que actualmente acceden al archivo. Entonces, si un archivo está abierto en el proceso maestro y se crea un proceso secundario, el recuento de referencias aumenta, ya que ahora también está abierto en el proceso secundario, y cuando se cierra en cualquiera de los procesos, disminuye. Un archivo finalmente se cierra cuando el recuento de referencias llega a cero.