homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author amoffat
Recipients amoffat
Date 2012年09月10日.00:58:12
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1347238694.31.0.649838162085.issue15898@psf.upfronthosting.co.za>
In-reply-to
Content
I'm getting some kind of race condition on OSX when trying to read the output from a pseudoterminal of a forked process. This race conditional only occurs if I run tty.tcsetattr on the master side of the pty, regardless of if I actually change the mode or not.
Try running the following code on OSX multiple times. Sometimes you'll see "testing", sometimes you won't, sometimes it hangs. If you comment out "tty.tcsetattr", you will consistently see "testing".
import os
import pty
import resource
import signal
import tty
master, slave = pty.openpty()
pid = os.fork()
# BUG IS HERE
# we're not making any changes to the tty mode, but
# the mere act of setting a mode causes the output to only
# show up sometimes.
#
# comment out "tty.tcsetattr" and the bug goes away
mode = tty.tcgetattr(master)
tty.tcsetattr(master, tty.TCSANOW, mode)
# child process
if pid == 0:
 os.setsid()
 os.close(master)
 os.dup2(slave, 0)
 os.dup2(slave, 1)
 os.dup2(slave, 2)
 max_fd = resource.getrlimit(resource.RLIMIT_NOFILE)[0]
 os.closerange(3, max_fd)
 # make controlling terminal. taken from pty.fork
 tmp_fd = os.open(os.ttyname(1), os.O_RDWR)
 os.close(tmp_fd)
 os.write(1, "testing".encode())
 os._exit(255)
# parent process
else:
 os.close(slave)
 try:
 print(os.read(master, 1024))
 finally:
 os.kill(pid, signal.SIGKILL)
History
Date User Action Args
2012年09月10日 00:58:14amoffatsetrecipients: + amoffat
2012年09月10日 00:58:14amoffatsetmessageid: <1347238694.31.0.649838162085.issue15898@psf.upfronthosting.co.za>
2012年09月10日 00:58:13amoffatlinkissue15898 messages
2012年09月10日 00:58:12amoffatcreate

AltStyle によって変換されたページ (->オリジナル) /