/* Exemplu de utilizare a apelului select()

   Se asteapta un text de la intrarea standard maxim 5 secunde 
   (adaptare dupa exemplul din manual)
   
   Autor: Sabin-Corneliu Buraga <busaco@infoiasi.ro> (c)1998-2001
   Versiunea: 1.0 (ultima actualizare: 28 aprilie 2001)
*/

#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>

/* programul */
int
main ()
{
  fd_set readfds;		/* multimea de descriptori de citire */
  struct timeval tv;		/* structura de timp */
  char name[20];		/* numele citit de la intrarea standard */
  int retval;			/* valoarea returnata de select() */

  FD_ZERO (&readfds);		/* initial multimea este vida */
  FD_SET (0, &readfds);		/* multimea va contine un singur descriptor */

  /* setam timpul de asteptare pentru 5 secunde */
  tv.tv_sec = 5;
  tv.tv_usec = 0;

  printf ("Introduceti un nume (in maxim 5 secunde): ");
  fflush (stdout);

  if ((retval = select (1, &readfds, NULL, NULL, &tv)) < 0)
    {
      perror ("Eroare la select().\n");
      return 1;
    }
  if (retval)			/* este un singur descriptor gata de citire */
    {
      if (FD_ISSET (0, &readfds))	/* ar trebui sa fie adevarat */
	{
	  fgets (name, 20, stdin);
	  name[strlen (name) - 1] = '\0';	/* eliminam NewLine din sir */
	  printf ("Salut, %s!\n", name);
	}
      else
	printf ("Inca nu suntem gata de citire...\n");
    }
  else				/* select a returnat o valoare nula, 
				   timpul a expirat */
    printf ("Timpul a expirat...\n");
}				/* main */

