| Index: third_party/pexpect/notes/my_forkpty.py
|
| diff --git a/third_party/pexpect/notes/my_forkpty.py b/third_party/pexpect/notes/my_forkpty.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f2bef23bd68243c4ba3c06e3e415154e0e7e4d96
|
| --- /dev/null
|
| +++ b/third_party/pexpect/notes/my_forkpty.py
|
| @@ -0,0 +1,89 @@
|
| +import os, fcntl, termios
|
| +import time
|
| +
|
| +def my_forkpty():
|
| +
|
| + (master_fd, slave_fd) = os.openpty()
|
| +
|
| + if (master_fd < 0 or slave_fd < 0):
|
| + raise ExceptionPexpect("Forkpty failed")
|
| +
|
| + # slave_name = ptsname(master_fd);
|
| +
|
| + pid = os.fork();
|
| + if pid == -1:
|
| + raise ExceptionPexpect("Forkpty failed")
|
| + elif pid == 0: # Child
|
| + if hasattr(termios, 'TIOCNOTTY'):
|
| + # Some platforms require an explicit detach of the
|
| + # current controlling tty before closing stdin, stdout, stderr.
|
| + # OpenBSD says that this is obsolete, but doesn't hurt.
|
| + try:
|
| + fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
|
| + except:
|
| + pass
|
| + else: #if fd >= 0:
|
| + fcntl.ioctl(fd, termios.TIOCNOTTY, 0)
|
| + os.close(fd)
|
| +
|
| + # The setsid() system call will place the process into its own session
|
| + # which has the effect of disassociating it from the controlling terminal.
|
| + # This is known to be true for OpenBSD.
|
| + os.setsid()
|
| + # except: return posix_error();
|
| +
|
| + # Verify that we are disconnected from the controlling tty.
|
| + try:
|
| + fd = os.open("/dev/tty", os.O_RDWR | os.O_NOCTTY)
|
| + os.close(fd)
|
| + raise ExceptionPexpect("Forkpty failed")
|
| + except:
|
| + pass
|
| + if 'TIOCSCTTY' in dir(termios):
|
| + # Make the pseudo terminal the controlling terminal for this process
|
| + # (the process must not currently have a controlling terminal).
|
| + if fcntl.ioctl(slave_fd, termios.TIOCSCTTY, '') < 0:
|
| + raise ExceptionPexpect("Forkpty failed")
|
| +
|
| +# # Verify that we can open to the slave pty file. */
|
| +# fd = os.open(slave_name, os.O_RDWR);
|
| +# if fd < 0:
|
| +# raise ExceptionPexpect("Forkpty failed")
|
| +# else:
|
| +# os.close(fd);
|
| +
|
| + # Verify that we now have a controlling tty.
|
| + fd = os.open("/dev/tty", os.O_WRONLY)
|
| + if fd < 0:
|
| + raise ExceptionPexpect("This process could not get a controlling tty.")
|
| + else:
|
| + os.close(fd)
|
| +
|
| + os.close(master_fd)
|
| + os.dup2(slave_fd, 0)
|
| + os.dup2(slave_fd, 1)
|
| + os.dup2(slave_fd, 2)
|
| + if slave_fd > 2:
|
| + os.close(slave_fd)
|
| + pid = 0
|
| +
|
| + else:
|
| + # PARENT
|
| + os.close(slave_fd);
|
| +
|
| + if pid == -1:
|
| + raise ExceptionPexpect("This process could not get a controlling tty.")
|
| +# if (pid == 0)
|
| +# PyOS_AfterFork();
|
| +
|
| + return (pid, master_fd)
|
| +
|
| +pid, fd = my_forkpty ()
|
| +if pid == 0: # child
|
| + print 'I am not a robot!'
|
| +else:
|
| + print '(pid, fd) = (%d, %d)' % (pid, fd)
|
| + time.sleep(1) # Give the child a chance to print.
|
| + print 'Robots always say:', os.read(fd,100)
|
| + os.close(fd)
|
| +
|
|
|