Je peux donc exécuter un processus sous Unix / Linux en utilisant POSIX, mais existe-t-il un moyen de stocker / rediriger à la fois le STDOUT et le STDERR du processus vers un fichier? L'en- spawn.h
tête contient une décélération posix_spawn_file_actions_adddup2
qui semble pertinente, mais je ne sais pas trop comment l'utiliser.
Le processus apparaît:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
Le stockage de sortie:
...?
posix_spwan
est un pointeur de typeposix_spawn_file_actions_t
(celui que vous avez donné commeNULL
).posix_spawn
ouvrira, fermera ou dupliquera les descripteurs de fichiers hérités du processus appelant comme spécifié par l'posix_spawn_file_actions_t
objet. Lesposix_spawn_file_actions_{addclose,adddup2}
fonctions sont utilisées pour indiquer ce qui arrive à quel fd.Réponses:
Voici un exemple minimal de modification des descripteurs de fichier d'un processus généré, enregistré sous
foo.c
:Qu'est ce que ça fait?
posix_spwan
est un pointeur de typeposix_spawn_file_actions_t
(celui que vous avez donné commeNULL
).posix_spawn
ouvrira, fermera ou dupliquera les descripteurs de fichiers hérités du processus appelant comme spécifié par l'posix_spawn_file_actions_t
objet.posix_spawn_file_actions_t
objet (chiild_fd_actions
), et l'initialisons avecposix_spawn_file_actions_init()
.posix_spawn_file_actions_{addopen,addclose,addup2}
fonctions peuvent être utilisées pour ouvrir, fermer ou dupliquer des descripteurs de fichiers (après les fonctionsopen(3)
,close(3)
etdup2(3)
) respectivement.posix_spawn_file_actions_addopen
un fichier à/tmp/foo-log
un descripteur de fichier1
(aka stdout).posix_spawn_file_actions_adddup2
fd2
(akastderr
) à fd 1.child_fd_actions
objet pour noter que ces actions doivent être effectuées.posix_spawn
avec l'child_fd_actions
objet.Le tester:
Comme vous pouvez le voir, stdout et stderr du processus engendré sont tous deux passés à
/tmp/foo-log
.la source
posix_spawn*
ne définissez pas errno. Ainsi, vous ne pouvez pas utiliserperror()
. Utilisez quelque chose comme à lafprintf(stderr, "...: %s\n", strerror(ret))
place. En outre, la fonction principale manque unereturn 0
instruction.Oui, vous pouvez. Définir la bonne liste d'actions de fichiers de réapparition posix est définitivement la voie à suivre.
Exemple:
Compiler et tester:
Notez que les
posix_spawn
fonctions ne définissent pas errno, contrairement à la plupart des autres fonctions UNIX, elles renvoient un code d'erreur. Ainsi, nous ne pouvons pas utiliserperror()
mais devons utiliser quelque chose commestrerror()
.Nous utilisons deux actions de création de fichier: addopen et addup2. L'addopen est similaire à un normal
open()
mais vous spécifiez également un descripteur de fichier qui est automatiquement fermé s'il est déjà ouvert (ici 1, c'est-à-dire stdout). L'addup2 a des effets similaires àdup2()
, c'est- à -dire que le descripteur de fichier cible (ici 2, c'est-à-dire stderr) est atomiquement fermé avant que 1 ne soit dupliqué sur 2. Ces actions ne sont exécutées que dans l'enfant créé parposix_spawn
, c'est-à-dire juste avant d'exécuter la commande spécifiée.Comme
fork()
,posix_spawn()
etposix_spawnp()
revenez immédiatement au parent. Ainsi, nous devons utiliserwaitid()
ouwaitpid()
attendre explicitementchild_pid
la résiliation de.la source