免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1348 | 回复: 0
打印 上一主题 下一主题

关于异步I/O的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-15 16:13 |只看该作者 |倒序浏览
        小弟在看《unix/linux编程实践教程》这本书,第7章的习题15关于异步I/O的题我有些不懂,题目的大意是:在终端上有个"hello"字符串,用curses库,信号,异步I/O来使得该字符串自动左右移动。下面是代码:
  1. #include        <stdio.h>
  2. #include        <curses.h>
  3. #include        <signal.h>
  4. #include        <fcntl.h>
  5. #include        <string.h>
  6. /* some global settings main and the handler use */

  7. #define        MESSAGE        "hello"
  8. #define BLANK   "     "

  9. int        row;        /* current row                */
  10. int        col;        /* current column        */
  11. int        dir;        /* where we are going        */
  12. int        delay;        /* bigger => slower        */
  13. int        done;

  14. void        on_input(int);        /* handler for keybd    */
  15. void        enable_kbd_signals();

  16. int main()
  17. {
  18.         initscr();
  19.         crmode();
  20.         noecho();
  21.         clear();

  22.         signal(SIGIO,on_input); /* install a handler        */
  23.         //enable_kbd_signals();   /* turn on kbd signals      */  //为什么注释掉这一句后,字符串就可以自动移动??为什么有这句的时候,必须要按"上下左右"键才可以使得字符串进行移动?

  24.         row   = 10;                /* start here                */
  25.         col   = 0;
  26.         dir   = 1;                /* add 1 to col number        */
  27.         delay = 200;                /* 200ms = 0.2 seconds  */
  28.         done  = 0;

  29.         while(!done)
  30.         {
  31.                 usleep(delay);
  32.                 move_msg();
  33.         }
  34.         endwin();
  35.         return 0;
  36. }

  37. /*
  38. * called after each sleep period
  39. */

  40. move_msg()
  41. {
  42.         move( row, col );
  43.         addstr( BLANK );
  44.         col += dir;                        /* move to new column        */
  45.         move( row, col );                /* then set cursor        */
  46.         addstr( MESSAGE );                /* redo message                */
  47.         move(0,COLS-1);
  48.         refresh();                        /* and show it                */

  49.         /*
  50.          * now handle borders
  51.          */
  52.         if ( dir == -1 && col <= 0 )
  53.                 dir = 1;
  54.         else if ( dir == 1 && col+strlen(MESSAGE) >= COLS )
  55.                 dir = -1;
  56. }

  57. /*
  58. *  called when a keystroke appears
  59. */
  60. void on_input(int signum)
  61. {
  62.         int        c = getch();                  /* grab the char */

  63.         switch ( c ){
  64.                 case 'Q':
  65.                 case EOF: done = 1;
  66.                           break;
  67.                 case ' ': dir = -dir;
  68.                           break;
  69.                 case 'f': if ( delay > 2 )
  70.                                   delay >>= 1;
  71.                           break;
  72.                 case 's': delay <<= 1;
  73.                           break;
  74.         }
  75. }

  76. /*
  77. * install a handler, tell kernel who to notify on input, enable signals
  78. */
  79. void enable_kbd_signals()
  80. {
  81.         int  fd_flags;

  82.         fcntl(0, F_SETOWN, getpid());
  83.         fd_flags = fcntl(0, F_GETFL);
  84.         fcntl(0, F_SETFL, (fd_flags|O_ASYNC));
  85. }
复制代码
代码中有个问题,我完全不能理解,如果您知道原因,请告诉小弟我,非常感谢。
是不是我理解的异步I/O原理有问题?我是这样理解的:异步I/O实现了非阻塞的处理方式,可以同时处理多个信号。如果我的理解有问题,请您告诉我,非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP