From 8b3a1328a3fb85e85f43449ae58f800788698f61 Mon Sep 17 00:00:00 2001 From: leitner Date: Fri, 12 Sep 2003 23:18:51 +0000 Subject: [PATCH] oops, forgot to add sigio test program --- trysigio.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 trysigio.c diff --git a/trysigio.c b/trysigio.c new file mode 100644 index 0000000..5523ba3 --- /dev/null +++ b/trysigio.c @@ -0,0 +1,39 @@ +#define _GNU_SOURCE +#include +#include +#include +#include + +int main() { + int signum=SIGRTMIN+1; + sigset_t ss; + sigemptyset(&ss); + sigaddset(&ss,signum); + sigaddset(&ss,SIGIO); + sigprocmask(SIG_BLOCK,&ss,0); + + fcntl(0 /* fd */,F_SETOWN,getpid()); + fcntl(0 /* fd */,F_SETSIG,signum); +#if defined(O_ONESIGFD) && defined(F_SETAUXFL) + fcntl(0 /* fd */, F_SETAUXFL, O_ONESIGFD); +#endif + fcntl(0 /* fd */,F_SETFL,fcntl(0 /* fd */,F_GETFL)|O_NONBLOCK|O_ASYNC); + + { + siginfo_t info; + struct timespec timeout; + int r; + timeout.tv_sec=1; timeout.tv_nsec=0; + switch ((r=sigtimedwait(&ss,&info,&timeout))) { + case SIGIO: + /* signal queue overflow */ + signal(signum,SIG_DFL); + /* do poll */ + break; + default: + if (r==signum) { + printf("event %c%c on fd #%d\n",info.si_band&POLLIN?'r':'-',info.si_band&POLLOUT?'w':'-',info.si_fd); + } + } + } +}