Estoy confundido acerca de cómo popen() redirige stdin, stdout y stderr del proceso secundario en Unix. La página man en popen() no es muy clara en este sentido. La llamadacómo controlar popen stdin, stdout, stderr redirection?
FILE *p = popen("/usr/bin/foo", "w");
horquillas un proceso hijo y ejecuta un shell con argumentos "-c", "/ usr/bin/foo", y redirige la entrada estándar de esta cáscara (que se redirige la entrada estándar de foo), stdout para pag. ¿Pero qué pasa con stderr? ¿Cuál es el principio general detrás de esto?
Me di cuenta de que si abro un archivo en foo (utilizando fopen, socket, accept etc.) y el proceso principal no tiene stdout, se le asigna el siguiente número de archivo disponible, que es 1 y así sucesivamente. Esto ofrece resultados inesperados de llamadas como fprintf (stderr, ...).
puede evitarse escribiendo
FILE *p = popen("/usr/bin/foo 2>/dev/null", "w");
en el programa de los padres, pero son sus mejores formas?
En cuanto a la pregunta original, que menciona el cierre de la salida estándar: No vuelvas a hacer esto . Los programas C en Unix suponen que 0,1,2 son descripciones de archivos sensibles, y todo invoca C en algún momento. Regla general: * siempre * reserve 0,1,2 para usar como stdio. Si quiere cerrar uno de ellos, redirigirlo a '/ dev/null' en su lugar para que el fd esté todavía ocupado y no se le asigne nada más. –