C++ Library containing a lot of needful things: Stack Trace, Command Line Parser, Resource Handling, Configuration Files, Unix Command Execution, Directories, Regular Expressions, Tokenizer, Function Trace, Standard Extensions.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

95 lines
2.2 KiB

#ifndef __MRW_UNISTD_HPP__
#define __MRW_UNISTD_HPP__
#include <unistd.h> // pipe, close
#include <errno.h> // errno
namespace mrw {
/** @addtogroup AutoTools */
//@{
/** @brief class that implements an unnamed UNIX pipe
@pre #include <mrw/unistd.hpp>
Implements a UNIX pipe that is automatically closed in
destructor and offers some facilities. */
class pipe {
private:
/// the filedescriptor, [0] to read and [1] to write
int _fd[2];
int _lastError;
public:
/// creates a unix pipe
pipe(): _lastError(-1) {
_fd[0] = -1;
_fd[1] = -1;
if (::pipe(_fd)==-1)
{
_lastError=errno;
}
}
/// destructor closes pipe if still open
~pipe() {
close();
}
/// closes pipe if open
void close() {
close_in();
close_out();
}
/// closes input pipe if open
void close_in() {
if (_fd[0]!=-1) while (::close(_fd[0])==-1) if (errno!=EINTR) {
_lastError = errno;
break;
}
_fd[0] = -1;
}
/// closes output pipe if open
void close_out() {
if (_fd[1]!=-1) while (::close(_fd[1])==-1) if (errno!=EINTR) {
_lastError = errno;
break;
}
_fd[1] = -1;
}
/// @return true if no error occured
operator bool() {
return _lastError == -1;
}
/// @return last error code, -1 if no error
int error() {
return _lastError;
}
/// connect output stream to @c stdout
void connect_cout() {
while (::dup2(_fd[1], 1)==-1) if (errno!=EINTR) {
_lastError = errno;
return;
}
}
/// connect output stream to @c stderr
void connect_cerr() {
while (::dup2(_fd[1], 2)==-1) if (errno!=EINTR) {
_lastError = errno;
return;
}
}
/// get an input stream
/** @return stream to read from
@note invalid after destruction or @c close or @c close_in */
int istream() {
return _fd[0];
}
/// get an output stream
/** @return stream to write to
@note invalid after destruction or @c close or @c close_out */
int ostream() {
return _fd[1];
}
};
//@}
}
#endif