По поводу пайпов между дочерними процессами на SO полно всякого разного: e.g. тыц, туц, тут – and I’m good.
А вот если я хочу stdout подпроцесса – в файл (или stderr в файл, или stdin из файла)? Видится мне два варианта:
-
В дочернем процессе, между fork() и exec() открыть файл и dup2() его в STDOUT (STDERR, STDIN). Ещё не добрался попробовать, будет ли это работать в принципе. И тут с ходу виден ещё один косяк: если exec()-нутая программа тоже создаст подпроцесс, то FD туда пробросится (я ж не могу его открыть O_CLOEXEC прямо перед вызовом exec()? или могу потому что dup2 в STD…?) и непонятно как оно там себя потом будет вести (pipe read end например не отдаст EOF пока не будут закрыты все FD).
-
В родительском процессе открывать файл и вручную (через epoll API) перекачивать из него данные в pipe. Чёрт с ним с геморроем, у меня уже есть работающий epoll loop. Но тут не запустить дочерний процесс асинхронно: родитель не может завершиться, не дождавшись завершения детей.
Собсна, сабж.