pair<UniqueHandle, UniqueHandle> MakePipe() { # if YCL_Win32 ::HANDLE h_raw_read, h_raw_write; YCL_CallWin32F(CreatePipe, &h_raw_read, &h_raw_write, {}, 0); UniqueHandle h_read(h_raw_read), h_write(h_raw_write); YCL_CallWin32F(SetHandleInformation, h_write.get(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); return {std::move(h_read), std::move(h_write)}; # elif YCL_API_Has_unistd_h int fds[2]; // TODO: Check whether '::socketpair' is available. if(::pipe(fds) != 0) ThrowFileOperationFailure("Failed getting file size."); auto pr(make_pair(UniqueHandle(fds[0]), UniqueHandle(fds[1]))); auto check([](UniqueHandle& h, const char* msg){ // NOTE: %O_NONBLOCK is initially cleared on ::pipe results. // See http://pubs.opengroup.org/onlinepubs/9699919799/. if(!(h && h->SetNonblocking())) ThrowFileOperationFailure(msg); }); check(pr.first, "Failed making pipe for reading."), check(pr.second, "Failed making pipe for writing."); return pr; # else # error "Unsupported platform found." # endif }