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:
		@@ -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;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user