c – descriptor de file estándar – abierto si falta

Vi la siguiente function en setup.c del código fuente de git.

Código:

/* if any standard file descriptor is missing open it to /dev/null */ void sanitize_stdfds(void) { int fd = open("/dev/null", O_RDWR, 0); while (fd != -1 && fd < 2) fd = dup(fd); if (fd == -1) die_errno("open /dev/null or dup failed"); if (fd > 2) close(fd); } 

Intenta abrir descriptores de files stdio (0/1/2) a / dev / null, si faltan.

Mi pregunta es:

En while (fd != -1 && fd < 2) , ¿por qué usar 2 , pero no 3 ?

Porque si fd == 2 ha abierto descriptores de file 0,1,2 y no hay nada más que hacer. Solo necesitaba abrir esos 3 descriptores para stdin, stdout y stderr.

Si coloca allí 3, el bucle abriría los descriptores de file 0,1,2,3. Luego, la línea if (fd > 2) close(fd); cerraría el descriptor 3. Por lo tanto, funcionará en ambos casos, pero la solución original es mejor.

La razón de fd < 2 es porque ya ha llamado al método int fd = open("/dev/null", O_RDWR, 0); .

"El descriptor de file devuelto por una llamada exitosa (abierta) será el descriptor de file con el número más bajo que actualmente no está abierto para el process". Por lo tanto, si faltan los descriptores de files stdio (0/1/2), el retorno de open ya ha ocupado los descriptores de files perdidos. Entonces debes juzgar por 2 en lugar de 3.