pipes can be blocking, non blocking or blocking on one side only

default is again blocking, because it causes less trouble
This commit is contained in:
Marc Wäckerlin
2004-12-18 20:58:19 +00:00
parent 3e684a3419
commit 1386c24c79

View File

@@ -9,6 +9,10 @@
@license LGPL, see file <a href="license.html">COPYING</a> @license LGPL, see file <a href="license.html">COPYING</a>
$Log$ $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 Revision 1.6 2004/12/14 20:32:10 marc
support for connect_cin support for connect_cin
pipe is now non blocking by default pipe is now non blocking by default
@@ -55,20 +59,30 @@ namespace mrw {
int _fd[2]; int _fd[2];
int _lastError; int _lastError;
public: 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 /// creates a unix pipe
/** @param blocking Flag whether the pipe is blocking (default: no) */ /** @param mode Flag whether the pipe is blocking (default: yes) */
Pipe(bool blocking=false) throw(std::bad_exception): _lastError(-1) { Pipe(BlockingMode mode=blocking) throw(std::bad_exception):
_lastError(-1) {
_fd[0] = -1; _fd[0] = -1;
_fd[1] = -1; _fd[1] = -1;
if (::pipe(_fd)==-1) { if (::pipe(_fd)==-1) {
_lastError=errno; _lastError=errno;
return; return;
} }
if (!blocking) { if (mode==non_blocking || mode==block_output) {
int val(fcntl(_fd[0], F_GETFL, 0)); int val(fcntl(_fd[0], F_GETFL, 0));
if (fcntl(_fd[0], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1) if (fcntl(_fd[0], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1)
_lastError=errno; _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) if (fcntl(_fd[1], F_SETFL, (val!=-1?val:0)|O_NONBLOCK) == -1)
_lastError=errno; _lastError=errno;
} }