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.h
encabezado contiene una desaceleración posix_spawn_file_actions_adddup2
que 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_spwan
es un puntero de tipoposix_spawn_file_actions_t
(uno que ha dado comoNULL
).posix_spawn
abrirá, cerrará o duplicará los descriptores de archivos heredados del proceso de llamada según lo especificado por elposix_spawn_file_actions_t
objeto. 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_spwan
es un puntero de tipoposix_spawn_file_actions_t
(uno que ha dado comoNULL
).posix_spawn
abrirá, cerrará o duplicará los descriptores de archivos heredados del proceso de llamada según lo especificado por elposix_spawn_file_actions_t
objeto.posix_spawn_file_actions_t
objeto (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_addopen
un archivo en/tmp/foo-log
el descriptor de archivo1
(también conocido como stdout).posix_spawn_file_actions_adddup2
fd2
(akastderr
) a fd 1.child_fd_actions
objeto para tener en cuenta que estas acciones deben tomarse.posix_spawn
con elchild_fd_actions
objeto.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 0
declaració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_spawn
funciones 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_pid
la terminación.fuente