|
|
|
@ -9,6 +9,10 @@ |
|
|
|
|
@license LGPL, see file <a href="license.html">COPYING</a> |
|
|
|
|
|
|
|
|
|
$Log$ |
|
|
|
|
Revision 1.7 2004/12/18 20:58:19 marc |
|
|
|
|
pipes can be blocking, non blocking or blocking on one side only |
|
|
|
|
default is again blocking, because it causes less trouble |
|
|
|
|
|
|
|
|
|
Revision 1.6 2004/12/14 20:32:10 marc |
|
|
|
|
support for connect_cin |
|
|
|
|
pipe is now non blocking by default |
|
|
|
@ -55,20 +59,30 @@ namespace mrw { |
|
|
|
|
int _fd[2]; |
|
|
|
|
int _lastError; |
|
|
|
|
public: |
|
|
|
|
/// blocking mode
|
|
|
|
|
enum BlockingMode { |
|
|
|
|
non_blocking, ///< both sides are non blocking
|
|
|
|
|
block_input, ///< pipe input is blocking
|
|
|
|
|
block_output, ///< pipe output is blocking
|
|
|
|
|
blocking ///< both sides are blocking
|
|
|
|
|
}; |
|
|
|
|
/// creates a unix pipe
|
|
|
|
|
/** @param blocking Flag whether the pipe is blocking (default: no) */ |
|
|
|
|
Pipe(bool blocking=false) throw(std::bad_exception): _lastError(-1) { |
|
|
|
|
/** @param mode Flag whether the pipe is blocking (default: yes) */ |
|
|
|
|
Pipe(BlockingMode mode=blocking) throw(std::bad_exception): |
|
|
|
|
_lastError(-1) { |
|
|
|
|
_fd[0] = -1; |
|
|
|
|
_fd[1] = -1; |
|
|
|
|
if (::pipe(_fd)==-1) { |
|
|
|
|
_lastError=errno; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
if (!blocking) { |
|
|
|
|
if (mode==non_blocking || mode==block_output) { |
|
|
|
|
int val(fcntl(_fd[0], F_GETFL, 0)); |
|
|
|
|
if (fcntl(_fd[0], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1) |
|
|
|
|
_lastError=errno; |
|
|
|
|
val = fcntl(_fd[1], F_GETFL, 0); |
|
|
|
|
} |
|
|
|
|
if (mode==non_blocking || mode==block_input) { |
|
|
|
|
int val(fcntl(_fd[1], F_GETFL, 0)); |
|
|
|
|
if (fcntl(_fd[1], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1) |
|
|
|
|
_lastError=errno; |
|
|
|
|
} |
|
|
|
|