Entonces, puedo ejecutar un proceso en Unix / Linux usando POSIX, pero ¿hay alguna forma de almacenar / redirigir tanto el STDOUT como el STDERR del proceso a un archivo? El spawn.hencabezado contiene una desaceleración posix_spawn_file_actions_adddup2que parece relevante, pero no estoy seguro de cómo usarlo.
El proceso genera:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
El almacenamiento de salida:
...?

posix_spwanes un puntero de tipoposix_spawn_file_actions_t(uno que ha dado comoNULL).posix_spawnabrirá, cerrará o duplicará los descriptores de archivos heredados del proceso de llamada según lo especificado por elposix_spawn_file_actions_tobjeto. Lasposix_spawn_file_actions_{addclose,adddup2}funciones se utilizan para indicar qué sucede con qué fd.Respuestas:
Aquí hay un ejemplo mínimo de modificación de descriptores de archivo de un proceso generado, guardado como
foo.c:¿Qué hace?
posix_spwanes un puntero de tipoposix_spawn_file_actions_t(uno que ha dado comoNULL).posix_spawnabrirá, cerrará o duplicará los descriptores de archivos heredados del proceso de llamada según lo especificado por elposix_spawn_file_actions_tobjeto.posix_spawn_file_actions_tobjeto (chiild_fd_actions), y lo inicializamos conposix_spawn_file_actions_init().posix_spawn_file_actions_{addopen,addclose,addup2}funciones se pueden usar para abrir, cerrar o duplicar descriptores de archivo (después deopen(3),close(3)ydup2(3)funciones) respectivamente.posix_spawn_file_actions_addopenun archivo en/tmp/foo-logel descriptor de archivo1(también conocido como stdout).posix_spawn_file_actions_adddup2fd2(akastderr) a fd 1.child_fd_actionsobjeto para tener en cuenta que estas acciones deben tomarse.posix_spawncon elchild_fd_actionsobjeto.Probándolo:
Como puede ver, tanto stdout como stderr del proceso generado fueron a
/tmp/foo-log.fuente
posix_spawn*no configure errno. Por lo tanto, no puedes usarperror(). Use algo como en sufprintf(stderr, "...: %s\n", strerror(ret))lugar. Además, a la función principal le falta unareturn 0declaración.Sí tu puedes. Definir la lista correcta de acciones de archivo de generación posix definitivamente es el camino a seguir.
Ejemplo:
Compilar y probar:
Tenga en cuenta que las
posix_spawnfunciones no establecen errno, en cambio, a diferencia de la mayoría de las otras funciones de UNIX, devuelven un código de error. Por lo tanto, no podemos usar,perror()pero tenemos que usar algo comostrerror().Utilizamos dos acciones de generación de archivos: addopen y addup2. El addopen es similar a un normal
open()pero también especifica un descriptor de archivo que se cierra automáticamente si ya está abierto (aquí 1, es decir, stdout). El addup2 tiene efectos similares adup2(), es decir, el descriptor del archivo de destino (aquí 2, es decir, stderr) se cierra atómicamente antes de que 1 se duplique a 2. Esas acciones solo se ejecutan en el elemento secundario creado porposix_spawn, es decir, justo antes de ejecutar el comando especificado.Me gusta
fork(),posix_spawn()yposix_spawnp()volver inmediatamente a los padres. Por lo tanto, tenemos que usarwaitid()owaitpid()esperar explícitamentechild_pidla terminación.fuente