Interrupted read() calls update stat structure (Unix-specific)
Dave Hammond
daveh at marob.masa.com
Tue Jan 23 10:28:39 AEST 1990
I am having a problem with one of our programs interaction with
"idle-out" daemons, such as finger or "w". The program polls the
keyboard as part of an event gathering loop. The Unix SysV code does a
sequence of:
signal(SIGALRM, handler);
alarm(1);
read(0, ...);
alarm(0);
signal(SIGALRM,SIG_IGN);
to effect the poll. This works well, except that it cause the idle-out
program to think a read has occured. It seems that an interrupted
read() causes the stat structure a_time and m_time elements to be
updated, even though no input occured. The following small program
demonstrates this:
/* begin demonstration program */
/*
* This program reads from fd 0 until an EOF is seen. If no input occurs
* within 2 seconds, the read() is interrupted and the loop cycles.
* The printout shows the stat structure changes with each interrupted read().
*/
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
static int aflag = 0;
main()
{
char c[1];
int atrap();
struct stat sb;
for (;;aflag=0) {
signal(SIGALRM, atrap);
alarm(2);
if (read(0, c, 1) == 0)
break;
alarm(0);
signal(SIGALRM, SIG_IGN);
if (fstat(0, &sb) != -1)
printf("%s read: atime=%ld, mtime=%ld\n",
(aflag ? "interrupted" : "completed"),
sb.st_atime, sb.st_mtime);
}
exit(0);
}
atrap()
{
aflag++;
}
/* end demonstration program */
My question is -- given a (pre-streams) Unix SysV environment, is there
a method of polling the keyboard which will *not* produce a change to
the stat structure? I have tried toggling the fcntl() O_NDELAY bit, but
this seems to put a greater strain on the cpu. And, running with
O_NDELAY set for the duration of the program can really bite you, if an
unforseen death occurs.
Any solutions or suggestions will be greatly appreciated.
--
Dave Hammond
daveh at marob.masa.com
uunet!masa.com!marob!daveh
More information about the Comp.lang.c
mailing list