Hi Julio,
On 05/04/2016 04:00 PM, Julio Guerra wrote:
> Hi,
>
> When a tty (here a slave pty) is set in noncanonical input and blocking read
> modes, a read() randomly blocks when:
> "VMIN > kernel received >= user buffer size > 0".
>
> The standard says that read() should block until VMIN bytes are received
> [1][2]. Whether this is an implementation defined case not really specified
> by POSIX or not, it should not behave randomly (otherwise it really should be
> documented in termios manpage).
This is not a bug.
>From the termios(3) man page:
* MIN > 0; TIME == 0: read(2) blocks until the lesser of MIN bytes or
the number of bytes requested are avail‐
able, and returns the lesser of these two values.
Regards,
Peter Hurley
> I isolated it in the following example (with VMIN = 5, received = 4, user
> buffer = 3):
> https://gist.github.com/Julio-Guerra/b3fdefab281403073607d81cabcea04a
>
> Since it is random, you will need run it several times to observe both cases.
> When correctly behaving, it should block in the read() for ever (C-c to kill
> it). When incorrectly behaving, it does not block and reads into the user
> buffer what is present in the kernel receive buffer (string "any").
>
> Example where it does not block 3 times out of 4:
> > $ ./a.out
> > res=3 buf=any
> > $ ./a.out
> > res=3 buf=any
> > $ ./a.out
> > ^C⏎
>
> Linux version 4.5.1-1-ARCH (builduser@tobias) (gcc version 5.3.0 (GCC) ) #1
> SMP PREEMPT Thu Apr 14 19:19:32 CEST 2016
>
> [1] "Canonical and noncanonical mode", man termios
> [2] http://www.gnu.org/software/libc/manual/html_node/Noncanonical-Input.html
>