aa

Signal-Driven I/O
•Concepts and steps for using signal-driven I/O
•UDP echo server using signal-driven I/O
•Readings
– UNP Section 6.2, Ch25

Motivation

• Efficiently detecting an asynchronous
event (arrival of a connection, arrival
of a message, etc) is difficult.
– Blocking IO: can block for a long time
– Nonblocking IO: do not block for a long
tib tt kllit di
Motivation
time, but must keep polling – tedious
– How do we deal with other types of
asynchronous events? E. g. input from
keyboard?
• Using interrupt
• Corresponding to this, we have signal
driven IO

Signal-driven I/O

•The kernel raises a signal (SIGIO) when something
happens to a file descriptor
•Three steps to use signal-driven I/O with sockets
– Establish a signal handler for SIGIO
• Functions signal/sigaction
Signal-driven I/O
– Set the socket owner
• fcntl with command F_SETOWN
– Enable signal-driven I/O for the socket
• fcntl with command O_SETFL (turn on O_ASYNC)
• ioctl with request FIOASYNC

Set Socket Owner

•Function fcntl with command F_SETOWN
– fcntl(int fd, int cmd, … /* int arg*/)
– Set process ID or process group ID to receive SIGIO and
SIGURG signals
– Arg > 0: process ID == arg
– Arg < 0: process group ID == |arg|– Arg < 0: process group ID == |arg|
fcntl(sockfd, F_SETOWN, getpid() ) ;

Enable Signal-Driven I/O for Socket

•Function fcntl with command F_SETFL
– Turn on O_ASYNC
int flag;
flag = fcntl(sockfd, F_GETFL, 0) ;
fcntl(sockfd, F_SETFL, flag | O_ASYNC) ;
•Function ioctl with request FIOASYNC
int on = 1;
ioctl(sockfd, FIOASYNC, &on) ;

Complication of Signal-Driven I/O
•Signals are not queued when they are blocked
– When SIGIO is blocked, at most one SIGIO signal will be
pending even if two pieces of data arrive
– No one to one mapping between number of signals and
arrived data
•In handler of SIGIO, we need to handle all arriving
data
– Read until there is no data (how?)
•Nonblocking I/O needs to be used with signal-driven

When is SIGIO raised?

•For UDP sockets
– A datagram arrives
– An error occurs
•For TCP sockets
– A connection request has completed
– A disconnect request has been initiated
A disconnect request has completed
When is SIGIO raised?
– A disconnect request has completed
– Half of a connection has been shut down
– Data has arrived
– Data has been sent
•Too many SIGIOs for a TCP socket – rarely used
– listening socket

Echo Server with Signal-Driven I/O

•Examples udp_echo_server.cpp and
udp_echo_client.cpp
•A particular use of signal-driven I/O is NTP (network pg(
time protocol)
– Time sensitive.
– A server needs to record the accurate arrival time of a
datagram and return to client.

posted @ 2019-07-08 16:27  CoderJerry  阅读(393)  评论(0)    收藏  举报