Mogę więc uruchomić proces w systemie Unix / Linux przy użyciu POSIX, ale czy jest jakiś sposób, aby zapisać / przekierować STDOUT i STDERR procesu do pliku? spawn.h
Nagłówek zawiera spowolnienie posix_spawn_file_actions_adddup2
który wygląda istotne, ale nie jestem pewien, dość, jak go używać.
Proces spawnowania:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
Pamięć wyjściowa:
...?
posix_spwan
jest wskaźnik typuposix_spawn_file_actions_t
(ten, który podałeś jakoNULL
).posix_spawn
otworzy, zamknie lub powieli deskryptory plików odziedziczone po procesie wywoływania określonym przezposix_spawn_file_actions_t
obiekt. Teposix_spawn_file_actions_{addclose,adddup2}
funkcje są używane, aby wskazać, co się dzieje, z którym fd.Odpowiedzi:
Oto minimalny przykład modyfikacji deskryptorów plików spawnowanego procesu, zapisany jako
foo.c
:Co to robi?
posix_spwan
to wskaźnik typuposix_spawn_file_actions_t
(ten, który podałeś jakoNULL
).posix_spawn
otworzy, zamknie lub powieli deskryptory plików odziedziczone po procesie wywoływania określonym przezposix_spawn_file_actions_t
obiekt.posix_spawn_file_actions_t
obiektu (chiild_fd_actions
) i inicjalizujemy goposix_spawn_file_actions_init()
.posix_spawn_file_actions_{addopen,addclose,addup2}
funkcje mogą być wykorzystywane do otwierania, zamykania lub powielonych deskryptorów (poopen(3)
,close(3)
idup2(3)
funkcje), odpowiednio.posix_spawn_file_actions_addopen
plik na/tmp/foo-log
do pliku deskryptora1
(aka stdout).posix_spawn_file_actions_adddup2
fd2
(akastderr
) do fd 1.child_fd_actions
obiekt, aby zauważyć, że należy podjąć te działania.posix_spawn
zchild_fd_actions
przedmiotem.Testowanie:
Jak widać, zarówno stdout, jak i stderr odrodzonego procesu poszły do
/tmp/foo-log
.źródło
posix_spawn*
nie ustawiaj errno. Dlatego nie możesz używaćperror()
.fprintf(stderr, "...: %s\n", strerror(ret))
Zamiast tego użyj czegoś takiego . Ponadto w głównej funkcji brakujereturn 0
instrukcji.Tak, możesz. Zdecydowanie słuszne jest zdefiniowanie właściwej listy akcji odradzania plików posix.
Przykład:
Skompiluj i przetestuj:
Zauważ, że
posix_spawn
funkcje nie ustawiają errno, zamiast tego, w przeciwieństwie do większości innych funkcji UNIX, zwracają kod błędu. Dlatego nie możemy użyć,perror()
ale musimy użyć czegoś takiegostrerror()
.Używamy dwóch akcji plików spawn: addopen i addup2. Addopen jest podobny do normalnego,
open()
ale określasz także deskryptor pliku, który jest automatycznie zamykany, jeśli jest już otwarty (tutaj 1, tzn. Standardowe wyjście). Addup2 ma podobne efektydup2()
, tj. Deskryptor pliku docelowego (tutaj 2, tj. Stderr) jest atomowo zamykany, zanim 1 zostanie zduplikowany do 2. Te akcje są wykonywane tylko w podrzędnym utworzonym przezposix_spawn
, tj. Tuż przed wykonaniem określonego polecenia.Jak
fork()
,posix_spawn()
iposix_spawnp()
natychmiast wrócić do rodziców. W związku z tym musimy wykorzystaćwaitid()
lubwaitpid()
wyraźnie poczekać nachild_pid
zakończenie.źródło