On Fri, 27 Jul 2012, David Xu wrote:
On 2012/7/27 10:07, Bruce Evans wrote:
I think it's working almost as expected. Large blocks give non-atomic
I/O, so the reader sees small blocks, then EOF when it gets ahead of
the writer. This always happens without SMP.
Not is a bug (debugged below). There is no SIGPIPE at the start of
write() because there is a reader then, and no SIGPIPE for the next
write() because there is no next write() -- the current one doesn't
notice when the reader goes away.
After fixed dd to not open fifo output file in O_RDWR mode, I still found the
writer is blocked there even the reader is already exited.
I'm not sure that dd's open is a bug. It must be intentional to use
O_RDWR for some cases.
POSIX (old 2001 draft) doesn't say anything about dd's open mode.
I think this is definitely a bug. if reader is exited, the writer should be
aborted too,
but I found it still be blocked in state "pipedwt", obviously, the code in
/sys/fs/fifo_vnops.c wants to wake up the writer when the reader is closing
the fifo,
but it failed, because the bit flag PIPE_WANTW is forgotten to be set by
writer,
so it skips executing wakeup(), and then the writer has no chance to find EOF
bit flag
is set.
Does this affect nameless pipes too? The old implementation presumably
doesn't have this bug.
Bruce
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"