Ich kann also einen Prozess unter Unix / Linux mit POSIX ausführen. Gibt es jedoch eine Möglichkeit, STDOUT und STDERR des Prozesses in einer Datei zu speichern / umzuleiten? Der spawn.h
Header enthält eine Verzögerung, posix_spawn_file_actions_adddup2
die relevant aussieht, aber ich bin mir nicht sicher, wie ich sie verwenden soll.
Der Prozess erzeugt:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
Der Ausgabespeicher:
...?
posix_spwan
ist ein Zeiger vom Typposix_spawn_file_actions_t
(einer, den Sie als angegeben habenNULL
).posix_spawn
öffnet, schließt oder dupliziert Dateideskriptoren, die vom aufrufenden Prozess geerbt wurden, wie vomposix_spawn_file_actions_t
Objekt angegeben. Dieposix_spawn_file_actions_{addclose,adddup2}
Funktionen werden verwendet, um anzuzeigen, was mit welchem fd passiert.Antworten:
Hier ist ein minimales Beispiel für das Ändern von Dateideskriptoren eines gespawnten Prozesses, gespeichert als
foo.c
:Was tut es?
posix_spwan
ist ein Zeiger vom Typposix_spawn_file_actions_t
(einer, den Sie als angegeben habenNULL
).posix_spawn
öffnet, schließt oder dupliziert Dateideskriptoren, die vom aufrufenden Prozess geerbt wurden, wie vomposix_spawn_file_actions_t
Objekt angegeben.posix_spawn_file_actions_t
Objekt (chiild_fd_actions
) und initialisieren es mitposix_spawn_file_actions_init()
.posix_spawn_file_actions_{addopen,addclose,addup2}
Funktionen können zu öffnen, schließen oder doppelte Datei - Deskriptoren verwendet werden (nach demopen(3)
,close(3)
unddup2(3)
Funktionen) sind.posix_spawn_file_actions_addopen
eine Datei an/tmp/foo-log
Datei-Deskriptor1
(auch bekannt als stdout).posix_spawn_file_actions_adddup2
fd2
(akastderr
) zu fd 1.child_fd_actions
Objekt einfach geändert, um zu beachten, dass diese Aktionen ausgeführt werden sollen.posix_spawn
mit demchild_fd_actions
Objekt.Testen Sie es aus:
Wie Sie sehen können, gingen sowohl stdout als auch stderr des erzeugten Prozesses an
/tmp/foo-log
.quelle
posix_spawn*
errno nicht gesetzt wird. Sie können also nicht verwendenperror()
. Verwenden Siefprintf(stderr, "...: %s\n", strerror(ret))
stattdessen so etwas wie . Außerdem fehlt der Hauptfunktion einereturn 0
Anweisung.Ja, du kannst. Das Definieren der richtigen Liste von Aktionen für Posix-Spawn-Dateien ist definitiv der richtige Weg.
Beispiel:
Kompilieren und testen:
Beachten Sie, dass die
posix_spawn
Funktionen nicht errno setzen, sondern im Gegensatz zu den meisten anderen UNIX-Funktionen einen Fehlercode zurückgeben. Daher können wir nicht verwenden,perror()
sondern müssen so etwas verwendenstrerror()
.Wir verwenden zwei Aktionen für Spawn-Dateien: addopen und addup2. Das Addopen ähnelt einem normalen,
open()
aber Sie geben auch einen Dateideskriptor an, der automatisch geschlossen wird, wenn er bereits geöffnet ist (hier 1, dh stdout). Das Addup2 hat ähnliche Auswirkungen wiedup2()
, dh der Zieldateideskriptor (hier 2, dh stderr) wird atomar geschlossen, bevor 1 zu 2 dupliziert wird. Diese Aktionen werden nur in dem von erstellten untergeordneten Element ausgeführtposix_spawn
, dh unmittelbar bevor es den angegebenen Befehl ausführt .Wie
fork()
,posix_spawn()
undposix_spawnp()
sofort wieder an die Eltern. Daher müssen wir die Kündigung verwendenwaitid()
oderwaitpid()
explizit darauf wartenchild_pid
.quelle