subprocess  0.4.0
Modern subprocess library for c++
pipe.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "basic_types.hpp"
4 
5 namespace subprocess {
6  /* You might be wondering why the C-like API. I played around with a more
7  C++ like API but it gets hairy quite fast trying to support all the
8  possible use-cases. My opinion is to simply roll a RAII class for
9  when you need it that is specific to your needs. 1, or a set of RAII
10  classes is too complex.
11  */
12  struct PipePair {
13  PipePair(){};
15  ~PipePair(){ close(); }
16  // No copy, move only
17  PipePair (const PipePair&)=delete;
18  PipePair& operator= (const PipePair&)=delete;
19  PipePair (PipePair&& other) { *this = std::move(other); }
20  PipePair& operator= (PipePair&& other);
21  /* we make it const as outside of code shouldn't modify these.
22  this might not be a good design as users may assume it's truly const.
23  disown, close*, and move semantics overwrite these values.
24  */
27 
29  void disown() {
30  const_cast<PipeHandle&>(input) = const_cast<PipeHandle&>(output) = kBadPipeValue;
31  }
32  void close();
33  void close_input();
34  void close_output();
35  explicit operator bool() const noexcept {
36  return input != output;
37  }
38  };
39 
44  bool pipe_close(PipeHandle handle);
53  PipePair pipe_create(bool inheritable = true);
60  void pipe_set_inheritable(PipeHandle handle, bool inheritable);
61 
66  ssize_t pipe_read(PipeHandle, void* buffer, size_t size);
71  ssize_t pipe_write(PipeHandle, const void* buffer, size_t size);
75  void pipe_ignore_and_close(PipeHandle handle);
83  std::string pipe_read_all(PipeHandle handle);
84 }
subprocess::PipePair::PipePair
PipePair(PipeHandle input, PipeHandle output)
Definition: pipe.hpp:14
subprocess::kBadPipeValue
const PipeHandle kBadPipeValue
Definition: basic_types.hpp:81
subprocess::pipe_ignore_and_close
void pipe_ignore_and_close(PipeHandle handle)
subprocess::PipePair::disown
void disown()
Definition: pipe.hpp:29
subprocess::PipePair::~PipePair
~PipePair()
Definition: pipe.hpp:15
subprocess::pipe_read_all
std::string pipe_read_all(PipeHandle handle)
subprocess::pipe_read
ssize_t pipe_read(PipeHandle, void *buffer, size_t size)
subprocess::PipeHandle
int PipeHandle
Definition: basic_types.hpp:74
subprocess::ssize_t
intptr_t ssize_t
Definition: basic_types.hpp:21
subprocess::PipePair::close_output
void close_output()
subprocess::PipePair::close_input
void close_input()
subprocess::PipePair::operator=
PipePair & operator=(const PipePair &)=delete
subprocess::PipePair::output
const PipeHandle output
Definition: pipe.hpp:26
subprocess::PipePair
Definition: pipe.hpp:12
subprocess::pipe_close
bool pipe_close(PipeHandle handle)
subprocess::PipePair::input
const PipeHandle input
Definition: pipe.hpp:25
subprocess
Definition: basic_types.hpp:19
basic_types.hpp
subprocess::pipe_write
ssize_t pipe_write(PipeHandle, const void *buffer, size_t size)
subprocess::PipePair::PipePair
PipePair(PipePair &&other)
Definition: pipe.hpp:19
subprocess::pipe_set_inheritable
void pipe_set_inheritable(PipeHandle handle, bool inheritable)
subprocess::pipe_create
PipePair pipe_create(bool inheritable=true)
subprocess::PipePair::close
void close()
subprocess::PipePair::PipePair
PipePair()
Definition: pipe.hpp:13