Date: Sun, 1 Jul 2001 23:39:39 +0300 (EET DST) From: jau@iki.fi (Jukka A. Ukkonen) To: freebsd-hackers@freebsd.org Subject: pty master and testing for write using select() Message-ID: <200107012039.XAA11434@cs132140.pp.htv.fi>
index | next in thread | raw e-mail
Hi all!
Sorry if this is a wrong forum for this sort of mail. I just
did not know any other forum that might have been a better match.
I tried using select() to test a pty master for readiness for
writing. If done twice without any I/O in between the calls
to select() the latter one blocked even when the timeout value
was specified as a timeval {0, 0}.
Even when it did not block the pty master seemed to be willing
to receive input until the pty buffer overflowed (the first
call to select()).
Test e.g.
socket localhost chargen | testprog
to see overflowed input being dropped. The 'testprog' should be
a process opening a pty and forking a child process to read the
pty slave and echo everything back.
I am sort of puzzled about this. Should the write test using
select() work at all for a pty master? If it should work, it
actually might not - apparently. And if it should not, what
is the point?
I cannot see any obvious reason why the pty master were somehow
a special case among different communication devices like pipes
and sockets in this respect.
As far as I can tell the following quote from the termios manual
page implies that it has probably been intentional that there is
no way to know in advance when there is space in the downstream
buffer of the pty.
<quote>
Each terminal device file has associated with it an input queue, into
which incoming data is stored by the system before being read by a pro-
cess. The system imposes a limit, {MAX_INPUT}, on the number of bytes
that may be stored in the input queue. The behavior of the system when
this limit is exceeded depends on the setting of the IMAXBEL flag in the
termios c_iflag. If this flag is set, the terminal is sent an ASCII BEL
character each time a character is received while the input queue is
full. Otherwise, the input queue is flushed upon receiving the charac-
ter.
</quote>
I think the pseudo terminal master would benefit from an input
option to make it correctly report it's writeability status
instead of simply flushing the clist.
If the above mentioned IMAXBEL should do exactly this, it is
my current belief that then the select() call does not properly
report the true status, because non-blocking writes still seem
to return errno == EAGAIN ("resource temporarily unavailable"),
though the select() call with zero timeout might block.
Even the TIOCOUTQ ioctl() seems not to be much of help when
trying to find out whether the downward pty buffer might have
any space available because it persistently returns 0.
Apparently it works for the upstream buffer only. So, some
other alternative way to avoid overflowing the downward pty
buffer would be very useful.
Cheers,
// jau
.--- ..- -.- -.- .- .- .-.-.- ..- -.- -.- --- -. . -.
/ Jukka A. Ukkonen, Mawit Ltd, Finland
/__ M.Sc. (sw-eng & cs) (Phone) +358-400-606-671
/ Internet: Jukka.Ukkonen@Mawit.Fi (Home) +358-9-6215-280
/ Internet: ukkonen@nic.funet.fi
v Internet: jau@iki.fi
+ + + + My opinions are mine and mine alone, not my employers. + + + +
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107012039.XAA11434>
