Skip site navigation (1)Skip section navigation (2)
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>

next in thread | raw e-mail | index | archive | help

	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




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107012039.XAA11434>