Hi,
I am having some difficulty with read(2) and interrupting signals. I
expect I am misunderstanding how the two work together, so would
appreciate some guidance.
I am trying to 'time out' a socket read after a certain delay. The logic
is (I will provide a test program below):
- create and connect socket
- associate signal handler function with SIGALRM
- start an alarm
- call read
- if read returns -1 check if errno is EINTR to detect the timeout
The manual page for read(2) on my OS (FreeBSD RELENG_4) says:
| ERRORS
|
| ...
| [EINTR] A read from a slow device was interrupted before any
| data arrived by the delivery of a signal.
I took this to mean that the delivery of a signal while read(2) was
blocking would cause it to return -1 and set errno to EINTR. However, I
believe I have a test case that shows this not to be true, so I must be
misunderstanding the interaction between read(2) and signals.
The test program (URL below), takes a hostname, port and timeout in
seconds as its arguments. It prints out a message to standard output
when the signal handler is called, and also when the read(2) completes
successfully.
If I use netcat to provide something for it to connect to, with three
test cases, I get the following results (netcat called as "nc -l -4 -p
3311" in all cases):
1) provide nothing for the program to read from netcat:
# ./readsignal localhost 3311 5
signal received: 14 (after 5 seconds)
*hangs*
2) provide data to be read before 5 seconds elapse
# ./readsignal localhost 3311 5
completed test successfully
#
3) provide data to be read after 5 seconds elapse
# ./readsignal localhost 3311 5
signal received: 14
completed test successfully
#
These results suggest to me that read(2) is not in fact interrupted by
the signal as the manual suggests.
My two questions are:
1) how does read(2) work in conjuction with signals, if not in the way
I interpreted it to?
2) what would be the recommended way of "timing out" a read from a
socket?
The test program that I was using to create these results is here:
http://www.olliecook.net/readsignal.c
Thanks for your time.
Ollie
--
Ollie Cook Systems Administrator, Claranet UK