11 template<
typename TPoller>
12 TPipe(TPoller& poller,
const std::string& exe,
const std::vector<std::string>& args,
bool stderrToStdout =
false)
13 : PipeLow(exe, args, stderrToStdout)
17 ReadHandle = std::make_unique<TPipeFileHandle<TPoller>>(PipeLow.ReadFd, poller);
18 WriteHandle = std::make_unique<TPipeFileHandle<TPoller>>(PipeLow.WriteFd, poller);
19 if (!stderrToStdout) {
20 ErrHandle = std::make_unique<TPipeFileHandle<TPoller>>(PipeLow.ErrFd, poller);
24 int Pid()
const {
return PipeLow.ChildPid; }
46 TPipeLow(
const std::string& exe,
const std::vector<std::string>& args,
bool mergeErr);
52 std::vector<std::string> Args;
59 bool StderrToStdout =
false;
62 struct TTypelessFileHandle {
63 virtual ~TTypelessFileHandle() =
default;
68 template<
typename TPoller>
69 struct TPipeFileHandle :
public TTypelessFileHandle {
70 TPipeFileHandle(
int fd, TPoller& poller)
75 co_return co_await Handle.ReadSome(buffer, size);
78 co_return co_await Handle.WriteSome(buffer, size);
81 typename TPoller::TFileHandle Handle;
85 std::unique_ptr<TTypelessFileHandle> ReadHandle;
86 std::unique_ptr<TTypelessFileHandle> WriteHandle;
87 std::unique_ptr<TTypelessFileHandle> ErrHandle;