NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: PR kern/60944: fifo opened non-blocking and set to blocking regression
> On Oct 31, 2026, at 5:02 PM, Taylor R Campbell <riastradh%netbsd.org@localhost> wrote:
>
>> Date: Fri, 30 Oct 2026 17:50:08 +0000 (UTC)
>> From: Christos Zoulas <christos%zoulas.com@localhost>
>>
>> Select should block if there are no writers on freshly opened FIFO
>> that is set to blocking.
>
> [citation needed]
>
> I reviewed all the relevant language in POSIX.1-2024 as research for
> PR kern/60792 (fifo: poll reader before writers?). It clearly
> prescribes (and other operating systems agree, and applications like
> GNU coreutils have long relied on the assumption) that _reading_ must
> not block -- and must immediately report EOF -- in that case:
>
> When attempting to read from an empty pipe or FIFO:
>
> If no process has the pipe open for writing, read()
> shall return 0 to indicate end-of-file.
>
> https://pubs.opengroup.org/onlinepubs/9799919799/functions/read.html
>
> (This was the subject of PR kern/60789 (read on fifo without writer
> may block), which arose because applications relying on POSIX
> semantics were broken on NetBSD due to an accident dating back to
> 1990 that FreeBSD fixed back in 1997.)
>
> And if read would return immediately without blocking, it is
> internally inconsistent for select to block instead of reporting
> immediately that read would not block.
>
> Applications can (and do) simply open the fifo for write if they want
> select/poll to reliably wait until a write actually materializes.
>
> (If the applications are going to rely on non-POSIX guarantees, they
> can even save a file descriptor and open it once with O_RDWR instead
> of twice, one with O_RDONLY and the other with O_WRONLY. I bet this
> works on more operating systems than the previous logic did, including
> older NetBSD.)
I don't have a citation, but I ran the example program on linux and MacOS/X
and they both block. I also don't understand how to get the behavior the program
wants now: to be able to open a fifo for reading the control endpoint using NONBLOCK,
set it to block again, then select on a bunch of fd's and service control messages
when they come.
christos
Home |
Main Index |
Thread Index |
Old Index