test_select.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. #include <pthread.h>
  2. #include <stdio.h>
  3. #ifndef ultrix
  4. #include <sys/fcntl.h>
  5. #else /* ultrix */
  6. #include <fcntl.h>
  7. #endif /* !ultrix */
  8. #include <sys/types.h>
  9. #include <sys/time.h>
  10. #ifdef hpux
  11. #include <sys/file.h>
  12. #endif /* hpux */
  13. #include <errno.h>
  14. #define NLOOPS 1000
  15. int ntouts = 0;
  16. void *
  17. bg_routine(void *arg)
  18. {
  19.   write(1,"bg routine runningn",19);
  20.   /*pthread_dump_state();*/
  21.   while (1) {
  22.     int n;
  23.     char dot;
  24.     dot = '.';
  25.     pthread_yield();
  26.     write(1,&dot,1);
  27.     pthread_yield();
  28.     n = NLOOPS;
  29.     while (n-- > 0)
  30.       pthread_yield();
  31.   }
  32. }
  33. void *
  34. fg_routine(void *arg)
  35. {
  36.   int flags, stat, nonblock_flag;
  37.   static struct timeval tout = { 0, 500000 };
  38. #if 0
  39. #if defined(hpux) || defined(__alpha)
  40.   nonblock_flag = O_NONBLOCK;
  41. #else
  42.   nonblock_flag = FNDELAY;
  43. #endif
  44.   printf("fg_routine runningn");
  45.   flags = fcntl(0, F_GETFL, 0);
  46.   printf("stdin flags b4 anything = %xn", flags);
  47.   stat = fcntl(0, F_SETFL, flags | nonblock_flag);
  48.   if (stat < 0) {
  49.     printf("fcntl(%x) => %dn", nonblock_flag, errno);
  50.     printf("could not set nonblocking i/o on stdin [oldf %x, stat %d]n",
  51.    flags, stat);
  52.     exit(1);
  53.   }
  54.   printf("stdin flags = 0x%x after turning on %xn", flags, nonblock_flag);
  55. #endif
  56.   while (1) {
  57.     int n;
  58.     fd_set r;
  59.     FD_ZERO(&r);
  60.     FD_SET(0,&r);
  61.     printf("select>");
  62.     n = select(1, &r, (fd_set*)0, (fd_set*)0, (struct timeval *)0);
  63.     if (n < 0) {
  64.       perror ("select");
  65.       exit(1);
  66.     } else if (n > 0) {
  67.       int nb;
  68.       char buf[128];
  69.       printf("=> select returned: %dn", n);
  70.       while ((nb = read(0, buf, sizeof(buf)-1)) >= 0) {
  71. buf[nb] = '';
  72. printf("read %d: |%s|n", nb, buf);
  73.       }
  74.       printf("=> out of read loop: %d / %dn", nb, errno);
  75.       if (nb < 0) {
  76. if (errno != EWOULDBLOCK && errno != EAGAIN) {
  77.   perror ("read");
  78.   exit(1);
  79. }
  80.       }
  81.     } else
  82.       ntouts++;
  83.   }
  84. }
  85. main(int argc, char **argv)
  86. {
  87.   pthread_t bg_thread, fg_thread;
  88.   int junk;
  89.   pthread_init();
  90.   setbuf(stdout,NULL);
  91.   setbuf(stderr,NULL);
  92.   if (argc > 1) {
  93.     if (pthread_create(&bg_thread, NULL, bg_routine, 0) < 0) {
  94.       printf("error: could not create bg threadn");
  95.       exit(1);
  96.     }
  97.   }
  98.   if (pthread_create(&fg_thread, NULL, fg_routine, 0) < 0) {
  99.     printf("error: could not create fg threadn");
  100.     exit(1);
  101.   }
  102.   printf("threads forked: bg=%lx fg=%lxn", bg_thread, fg_thread);
  103.   /*pthread_dump_state();*/
  104.   printf("initial thread %lx joining fg...n", pthread_self());
  105.   pthread_join(fg_thread, (void **)&junk);
  106. }