LINUX.ORG.RU

fork/exec + io redirect в файл — как правильно? (и/или как сделано в bash?)

 , ,


0

1

По поводу пайпов между дочерними процессами на SO полно всякого разного: e.g. тыц, туц, тут – and I’m good.

А вот если я хочу stdout подпроцесса – в файл (или stderr в файл, или stdin из файла)? Видится мне два варианта:

  1. В дочернем процессе, между fork() и exec() открыть файл и dup2() его в STDOUT (STDERR, STDIN). Ещё не добрался попробовать, будет ли это работать в принципе. И тут с ходу виден ещё один косяк: если exec()-нутая программа тоже создаст подпроцесс, то FD туда пробросится (я ж не могу его открыть O_CLOEXEC прямо перед вызовом exec()? или могу потому что dup2 в STD…?) и непонятно как оно там себя потом будет вести (pipe read end например не отдаст EOF пока не будут закрыты все FD).

  2. В родительском процессе открывать файл и вручную (через epoll API) перекачивать из него данные в pipe. Чёрт с ним с геморроем, у меня уже есть работающий epoll loop. Но тут не запустить дочерний процесс асинхронно: родитель не может завершиться, не дождавшись завершения детей.

Собсна, сабж.

★★★★★

Последнее исправление: dimgel (всего исправлений: 1)

в любом месте до execv() открываешь с O_CLOEXEC и делаешь dup2(,STDOUT_FILENO); dup2(,STDERR_FILENO)

быстрее было семпл проверить, чем на лор писать

anonymous
()
Ответ на: комментарий от anonymous

Спасибо!

быстрее было семпл проверить, чем на лор писать

Было б быстрее, так и сделал бы. :) Да и мало ли какие засады могут быть, даже если б семпл получился.

dimgel ★★★★★
() автор топика

как сделано в bash?

strace не завезли?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.