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.
25개 이상의 토픽을 선택하실 수 없습니다.
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.2 KiB
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
|
|
|