Mail Archives: cygwin/2006/09/07/17:25:22
POSIX requires "When a standard utility reads a seekable input file and
terminates without an error before it reaches end-of-file, the utility shall
ensure that the file offset in the open file description is properly positioned
just past the last byte processed by the utility."
For an example, POSIX requires these two commands to give the same results:
$ echo 1 2 3 | tr ' ' '\n' > file
$ tail -n +2 file
2
3
$ (sed -n 1q; cat) < file
2
3
On cygwin, this isn't happening:
$ (sed -n 1q; cat) < file
$
But on Solaris, it is:
$ (truss sed -n 1q; cat) < file 2>&1 | tail
fstat64(0, 0xFFBEED40) = 0
brk(0x00042100) = 0
brk(0x00044100) = 0
read(0, " 1\n 2\n 3\n", 8192) = 6
close(1) = 0
close(2) = 0
llseek(0, 0xFFFFFFFFFFFFFFFC, SEEK_CUR) = 2
_exit(0)
2
3
Notice the llseek(0,-4,SEEK_CUR) just before _exit, which restored the file
pointer back to the last character consumed, so that cat could then start up
from the right location.
I don't know whether a fix to this would lie in fclose() (making sure that on
input streams, the position of the underlying fd is restored when discarding
buffered data), or somewhere else, but it would be nice to see this fixed. And
it seems like the bug is in cygwin, not sed, since it is the same version of
GNU sed on both machines.
--
Eric Blake
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -