import sys, os import time import errno # This must match the initial buffersize used by fileobject.c, # and the chunksize returned by fread(). BUFSIZE = 4096 def writer(filew): print "[write] sending exact buffer" filew.write("x"*BUFSIZE) filew.flush() print "[write] sleeping" time.sleep(5) print "[write] sending exact buffer" filew.write("x"*BUFSIZE) filew.flush() print "[write] sleeping" time.sleep(5) def reader(filer): import fcntl fd = filer.fileno() flags = fcntl.fcntl (fd, fcntl.F_GETFL, 0) flags = flags | os.O_NONBLOCK fcntl.fcntl(fd, fcntl.F_SETFL, flags) print "[read] sleeping" time.sleep(2) readsize = 0 while 1: try: print "[read] reading" data = filer.read() print "[read] success (%d)" % len(data) readsize += len(data) if not data: if readsize == 2*BUFSIZE: print "[read] done!" sys.exit(0) else: print "[read] boom!" sys.exit(0) except IOError, e: print "[read] exception:", str(e) print "[read] sleeping" time.sleep(5) def main(): r, w = os.pipe() fr, fw = os.fdopen(r, 'r'), os.fdopen(w, 'w') pid = os.fork() if pid == 0: os.close(r) writer(fw) else: os.close(w) reader(fr) if __name__ == "__main__": main()