import sys, os import time import errno # Any value BUFSIZE = 8 def writer(filew): print "[write] sending incomplete buffer" filew.write("x"*(BUFSIZE-1)) 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) while 1: try: print "[read] reading" data = filer.read(BUFSIZE) print "[read] success (%d)" % len(data) if not data: print "[read] done!" sys.exit(0) except IOError, e: print "[read] exception:", str(e) if e[0] == 0: print "[read] boom!" sys.exit(1) 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()