select(), EOF...
(sorry if this is a dupe, I haven't seen it come from the list, so I'm resending as plain ASCII in case majordomo kills messages with strange stuff)
Hi,
I need to do something similar to tail -f.
I was hoping that select() or poll() would block my process after reaching EOF but (as the man says) EOF doesn't cause read() to block so select() and poll() both say I can read. The result is (obviously) that my program waits actively and uses all the CPU.
What's the right way of doing this? I assume the kernel provides facilities to find out if there is new data to read (other than EOF).
Thanks.
Quoted 14 lines · Carlos Fernández Sanz
(sorry if this is a dupe, I haven't seen it come from the list, so I'm resending as plain ASCII in case majordomo kills messages with strange stuff)
Hi,
I need to do something similar to tail -f.
I was hoping thatselect()orpoll()would block my process after reaching EOF but (as the man says) EOF doesn't causeread()to block soselect()andpoll()both say I can read. The result is (obviously) that my program waits actively and uses all the CPU.
What's the right way of doing this? I assume the kernel provides facilities to find out if there is new data to read (other than EOF).
Quoted 1 line
Thanks.
tail -f just alternates between open() and close(), keeping in memory the current byte offest into the file.
Signature · 1 line
Ignacio Vazquez-Abrams <[email protected]>
How come the process is never runnable unless there's new data in the file? If it was opening and closing the file continously it would be using lots of CPU, while it's 0 if there's no data coming.
----- Original Message -----
From: "Ignacio Vazquez-Abrams" <[email protected]>
To: <[email protected]>
Sent: Monday, August 20, 2001 10:45 PM
Subject: Re: Fw: select(), EOF...
Quoted 10 lines · Carlos Fernández Sanz
Quoted 9 lines
(sorry if this is a dupe, I haven't seen it come from the list, so I'm resending as plain ASCII in case majordomo kills messages with strange stuff)
Hi,
I need to do something similar to tail -f.
I was hoping thatselect()orpoll()would block my process after
reaching
Quoted 1 line
Quoted 1 line
EOF but (as the man says) EOF doesn't cause
read()to block soselect()
and
Quoted 1 line
Quoted 1 line
poll()both say I can read. The result is (obviously) that my program
waits
Quoted 2 lines
Quoted 2 lines
actively and uses all the CPU.
What's the right way of doing this? I assume the kernel provides
facilities
Quoted 16 lines
Quoted 3 lines
to find out if there is new data to read (other than EOF).
Thanks.
tail -f just alternates between
open()andclose(), keeping in memory the current byte offest into the file.--
Ignacio Vazquez-Abrams <[email protected]>-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 3 lines · Carlos Fernández Sanz
How come the process is never runnable unless there's new data in the file? If it was opening and closing the file continously it would be using lots of CPU, while it's 0 if there's no data coming.
It sleep()s between close() and open().
Signature · 1 line
Ignacio Vazquez-Abrams <[email protected]>
a strace shows it works differently
nanosleep({1, 0}, {1, 0}) = 0fstat(3, {st_mode=S_IFREG|0600, st_size=227128, ...}) = 0 rt_sigprocmask(SIG_BLOCK, [CHLD], [RT_0], 8) = 0 rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8) = 0 rt_sigprocmask(SIG_SETMASK, [RT_0], NULL, 8) = 0
the file is opened just once (as I expected), and tail sleeps in nanosleep () until the file grows. I think strace isn't showing more nanosleep() as it should be looping there. BTW what's the reason for the sigprocmask, etc?
----- Original Message -----
From: "Ignacio Vazquez-Abrams" <[email protected]>
To: "Carlos Fernández Sanz" <[email protected]>
Cc: <[email protected]>
Sent: Monday, August 20, 2001 11:00 PM
Subject: Re: Fw: select(), EOF...
Quoted 3 lines · Carlos Fernández Sanz
Quoted 2 lines
How come the process is never runnable unless there's new data in the
file?
Quoted 1 line
Quoted 1 line
If it was opening and closing the file continously it would be using
lots of
Quoted 13 lines
Quoted 1 line
CPU, while it's 0 if there's no data coming.
It sleep()s between
close()andopen().--
Ignacio Vazquez-Abrams <[email protected]>-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 11 lines · Carlos Fernández Sanz
a strace shows it works differently
nanosleep({1, 0}, {1, 0})= 0fstat(3, {st_mode=S_IFREG|0600, st_size=227128, ...})= 0rt_sigprocmask(SIG_BLOCK, [CHLD], [RT_0], 8)= 0rt_sigaction(SIGCHLD, NULL, {SIG_DFL}, 8)= 0rt_sigprocmask(SIG_SETMASK, [RT_0], NULL, 8)= 0the file is opened just once (as I expected), and tail sleeps in nanosleep () until the file grows. I think strace isn't showing more
nanosleep()as it should be looping there. BTW what's the reason for the sigprocmask, etc?
Huh. You're right. It seems that tail has changed since I last looked at the source. Now it uses stat() instead. However, tail in textutils 2.0.11 still calls sleep(). I don't know how sleep() is implemented, but it's not impossible for it to use nanosleep() and signals. I believe I read something about SIGALRM...
Signature · 1 line
Ignacio Vazquez-Abrams <[email protected]>