Question about SIGIO
Pamela Chan
chan at icsid2.icsi
Sun Jun 2 05:34:16 AEST 1991
Not long ago someone suggested that in order to catch the SIGIO signal
when doing non-blocking IO, one has to do a F_SETOWN to
specify the process group to receive the signal.
So here is the code I came up with:
THE RECEIVING SIDE
------------------
fcntl(sock, F_SETOWN, getpid());
fcntl(sock, F_SETFL, FASYNC|FNDELAY);
for(;;){
if (ret = read(sock, buf, 64)){ // read from socket
if (ret != -1){
ret = write(1, buf, ret); // output to stdout
}else{
sigpause(0); // block wait for SIGIO
}
}else{
quit();
}
}
THE SENDING SIDE
----------------
fcntl(sock, F_SETOWN, new_pid);
fcntl(sock, F_SETFL, FNDELAY|FASYNC);
for(;;){
if (ret1 = read(fd, buf, 1024)){ // reading from datafile
ret = write(sock, buf, ret1); // output to socket
if (ret<ret1) {
ret1 -= ret;
sigpause(0); // block wait for SIGIO
}
}
}
The problem is that only the receiving side can detect the SIGIO
signal, but not the sending side. I'm wondering if there is another
trick other than F_SETOWN that I need to do in order to detect the
signal. One interesting point is if I kill the connection at the
receiving end, the blocked sender will get a SIGIO and a SIGPIPE at
the same time.
--------------------------------------------------------------------
Pamela Chan International Computer Science Institute
E-mail: chan at icsi Berkeley, California
More information about the Comp.unix.programmer
mailing list