On Thu, 27 Mar 2008, Iñaki Baz C. wrote:
sigprocmask(SIG_BLOCK, NULL, []) = 0
sigprocmask(SIG_BLOCK, NULL, []) = 0
My guess is if you include the read statements you get something like
this…
read(3, “”, 1000) = 0
Which means (according to “man 2 read”)
On success, the number of bytes read is returned (zero indicates end
of file)
If you read “man select_tut”
9. If the functions read(2), recv(2), write(2), and send(2)
fail with errors other than those
listed in 7., or one of the input functions returns 0,
indicating end of file, then you should
not pass that descriptor to select() again. In the above
example, I close the descriptor immeâ€
diately, and then set it to -1 to prevent it being
included in a set.
Thus…
mkfifo foofi
ruby -w test.rb&
echo bah > foofi
==test.rb=============================================================
loop do
begin
open( “foofi”) do |f|
loop do
p select([f],nil,nil,500000)
p f.sysread(1000)
end
end
rescue EOFError => details
p details
end
end
Works as expected…
But…
======================================================================
open( “foofi”) do |f|
loop do
p select([f],nil,nil,500000)
p f.sysread(1000)
end
end
Bombs out with EOFError
but curiously
open( “foofi”) do |f|
loop do
p select([f],nil,nil,500000)
p f.read(1000)
end
end
Exhibits exactly the behaviour you describe.
Looking at the strace…
open(“foofi”, O_RDONLY|O_LARGEFILE) = 9
select(10, [9], NULL, NULL, {500000, 0}) = 1 (in [9], left {500000, 0})
fstat64(1, {st_dev=makedev(0, 11), st_ino=37, st_mode=S_IFCHR|0620,
st_nlink=1, st_uid=1001, st_gid=5, st_blksize=1024, st_blocks=0,
st_rdev=makedev(136, 35), st_atime=2008/03/27-14:45:52,
st_mtime=2008/03/27-14:45:52, st_ctime=2008/03/27-14:45:52}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7db2000
write(1, “[[#<File:foofi>], [], []]\n”, 26) = 26
fstat64(9, {st_dev=makedev(8, 3), st_ino=2375703, st_mode=S_IFIFO|0644,
st_nlink=1, st_uid=1001, st_gid=65534, st_blksize=4096, st_blocks=0,
st_size=0, st_atime=2008/03/27-14:43:56, st_mtime=2008/03/27-14:45:54,
st_ctime=2008/03/27-14:45:54}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1,
0) = 0xb7db1000
read(9, “bah\n”, 4096) = 4
read(9, “”, 4096) = 0
write(1, ““bah\n”\n”, 8) = 8
select(10, [9], NULL, NULL, {500000, 0}) = 1 (in [9], left {500000, 0})
write(1, “[[#<File:foofi>], [], []]\n”, 26) = 26
write(1, “nil\n”, 4) = 4
select(10, [9], NULL, NULL, {500000, 0}) = 1 (in [9], left {500000, 0})
write(1, “[[#<File:foofi>], [], []]\n”, 26) = 26
write(1, “nil\n”, 4) = 4
The curiosity is why doesn’t the f.read throw an EOFError
According to ri IO#read…
At end of file, it returns nil or "" depend on length.
ios.read() and ios.read(nil) returns "".
ios.read(positive-integer) returns nil.
So it all behaves according to plan… just not your plan… :-))
John C. Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : [email protected]
New Zealand