diff --git a/mrw/unistd.hpp b/mrw/unistd.hpp index 404d85f..d3336c6 100644 --- a/mrw/unistd.hpp +++ b/mrw/unistd.hpp @@ -9,6 +9,10 @@ @license LGPL, see file COPYING $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; }