asynctest.c
上传用户:wudi5211
上传日期:2010-01-21
资源大小:607k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

C/C++

  1. /*
  2.  * asynctest.c: use async notification to read stdin
  3.  *
  4.  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet
  5.  * Copyright (C) 2001 O'Reilly & Associates
  6.  *
  7.  * The source code in this file can be freely used, adapted,
  8.  * and redistributed in source or binary form, so long as an
  9.  * acknowledgment appears in derived source files.  The citation
  10.  * should list that the code comes from the book "Linux Device
  11.  * Drivers" by Alessandro Rubini and Jonathan Corbet, published
  12.  * by O'Reilly & Associates.   No warranty is attached;
  13.  * we cannot take responsibility for errors or fitness for use.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <signal.h>
  20. #include <fcntl.h>
  21. int gotdata=0;
  22. void sighandler(int signo)
  23. {
  24.     if (signo==SIGIO)
  25.         gotdata++;
  26.     return;
  27. }
  28. char buffer[4096];
  29. int main(int argc, char **argv)
  30. {
  31.     int count;
  32.     struct sigaction action;
  33.     memset(&action, 0, sizeof(action));
  34.     action.sa_handler = sighandler;
  35.     action.sa_flags = 0;
  36.     sigaction(SIGIO, &action, NULL);
  37.     fcntl(STDIN_FILENO, F_SETOWN, getpid());
  38.     fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL) | FASYNC);
  39.     while(1) {
  40.         /* this only returns if a signal arrives */
  41.         sleep(86400); /* one day */
  42.         if (!gotdata)
  43.             continue;
  44.         count=read(0, buffer, 4096);
  45.         /* buggy: if avail data is more than 4kbytes... */
  46.         write(1,buffer,count);
  47.         gotdata=0;
  48.     }
  49. }