Таким образом, я могу запустить процесс в Unix / Linux, используя POSIX, но есть ли способ сохранить / перенаправить как STDOUT, так и STDERR процесса в файл? spawn.h
Заголовок содержит замедление , posix_spawn_file_actions_adddup2
который выглядит уместно, но я не уверен , совсем как его использовать.
Процесс порождения:
posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ);
Выходное хранилище:
...?
posix_spwan
- это указатель типаposix_spawn_file_actions_t
(тот, который вы указали какNULL
).posix_spawn
откроет, закроет или продублирует файловые дескрипторы, унаследованные от вызывающего процесса, как указаноposix_spawn_file_actions_t
объектом. Этиposix_spawn_file_actions_{addclose,adddup2}
функции используются для обозначения того, что происходит с каким дескриптором.Ответы:
Вот минимальный пример изменения файловых дескрипторов порожденного процесса, сохраненный как
foo.c
:Что оно делает?
posix_spwan
- это указатель типаposix_spawn_file_actions_t
(тот, который вы указали какNULL
).posix_spawn
откроет, закроет или продублирует файловые дескрипторы, унаследованные от вызывающего процесса, как указаноposix_spawn_file_actions_t
объектом.posix_spawn_file_actions_t
объекта (chiild_fd_actions
) и инициализируем его с помощьюposix_spawn_file_actions_init()
.posix_spawn_file_actions_{addopen,addclose,addup2}
функции можно использовать для открытия, закрытия или дублирования файловых дескрипторов (послеopen(3)
,close(3)
иdup2(3)
функций) соответственно.posix_spawn_file_actions_addopen
файл в/tmp/foo-log
файловом дескрипторе1
(он же stdout).posix_spawn_file_actions_adddup2
FD2
(акаstderr
) до FD 1.child_fd_actions
объект, чтобы отметить, что эти действия должны быть предприняты.posix_spawn
сchild_fd_actions
объектом.Тестирование это:
Как видите, и stdout, и stderr порожденного процесса пошли в
/tmp/foo-log
.источник
posix_spawn*
не установить errno. Таким образом, вы не можете использоватьperror()
. Используйте что-то вродеfprintf(stderr, "...: %s\n", strerror(ret))
этого. Также в основной функции отсутствуетreturn 0
оператор.Да, ты можешь. Определить правильный список действий в файле posix spawn определенно стоит.
Пример:
Скомпилируйте и протестируйте:
Обратите внимание, что
posix_spawn
функции не устанавливают errno, вместо этого, в отличие от большинства других функций UNIX, они возвращают код ошибки. Таким образом, мы не можем использовать,perror()
но должны использовать что-то вродеstrerror()
.Мы используем два действия spawn file: addopen и addup2. Addopen похож на обычный,
open()
но вы также указываете дескриптор файла, который автоматически закрывается, если он уже открыт (здесь 1, т.е. stdout). Addup2 имеет аналогичные эффектыdup2()
, т. Е. Дескриптор целевого файла (здесь 2, то есть stderr) атомарно закрывается до того, как 1 дублируется до 2. Эти действия выполняются только в дочернем объекте, созданном , т. Е. Непосредственноposix_spawn
перед выполнением указанной команды.Как
fork()
,posix_spawn()
иposix_spawnp()
сразу же вернуться к родителю. Таким образом, мы должны использоватьwaitid()
илиwaitpid()
явно ждатьchild_pid
завершения.источник