root/maint/gnulib/tests/test-select-stdin.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. main

   1 /* Test of select() substitute, reading from stdin.
   2    Copyright (C) 2008-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 3 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
  18 
  19 #include <config.h>
  20 
  21 #include <stdio.h>
  22 #include <stdlib.h>
  23 #include <sys/select.h>
  24 #include <sys/time.h>
  25 #include <unistd.h>
  26 
  27 #include "macros.h"
  28 
  29 int
  30 main (void)
     /* [previous][next][first][last][top][bottom][index][help] */
  31 {
  32   printf ("Applying select() from standard input. Press Ctrl-C to abort.\n");
  33   for (;;)
  34     {
  35       struct timeval before;
  36       struct timeval after;
  37       unsigned long spent_usec;
  38       fd_set readfds;
  39       struct timeval timeout;
  40       int ret;
  41 
  42       gettimeofday (&before, NULL);
  43 
  44       FD_ZERO (&readfds);
  45       FD_SET (0, &readfds);
  46       timeout.tv_sec = 0;
  47       timeout.tv_usec = 500000;
  48       ret = select (1, &readfds, NULL, NULL, &timeout);
  49 
  50       gettimeofday (&after, NULL);
  51       spent_usec = (after.tv_sec - before.tv_sec) * 1000000
  52                    + after.tv_usec - before.tv_usec;
  53 
  54       if (ret < 0)
  55         {
  56           perror ("select failed");
  57           exit (1);
  58         }
  59       if ((ret == 0) != ! FD_ISSET (0, &readfds))
  60         {
  61           fprintf (stderr, "incorrect return value\n");
  62           exit (1);
  63         }
  64       if (ret == 0)
  65         {
  66           if (spent_usec < 250000)
  67             {
  68               fprintf (stderr, "returned too early\n");
  69               exit (1);
  70             }
  71           /* Timeout */
  72           printf (".");
  73           ASSERT (fflush (stdout) == 0);
  74         }
  75       else
  76         {
  77           char c;
  78 
  79           printf ("Input available! Trying to read 1 byte...\n");
  80           ASSERT (read (0, &c, 1) == 1);
  81         }
  82     }
  83 }

/* [previous][next][first][last][top][bottom][index][help] */