This example shows how to setup and use an fd_handler. See the explanation here.
#include <Ecore.h>
#include <unistd.h>
struct context
{
};
static void
{
   printf("prepare_cb called.\n");
}
{
   struct context *ctxt = data;
   char buf[1024];
   size_t nbytes;
   int fd;
     {
        printf("An error has occurred. Stop watching this fd and quit.\n");
        ctxt->handler = NULL;
     }
   nbytes = read(fd, buf, sizeof(buf));
   if (nbytes == 0)
     {
        printf("Nothing to read, exiting...\n");
        ctxt->handler = NULL;
     }
   buf[nbytes - 1] = '\0';
   printf("Read %zd bytes from input: \"%s\"\n", nbytes - 1, buf);
}
{
   printf("Timer expired after 5 seconds...\n");
}
int
main(void)
{
   struct context ctxt = {0};
     {
        printf("ERROR: Cannot init Ecore!\n");
        return -1;
     }
                                            _fd_handler_cb,
                                            &ctxt, NULL, NULL);
   printf("Starting the main loop. Type anything and hit <enter> to "
          "activate the fd_handler callback, or CTRL+d to shutdown.\n");
   if (ctxt.handler)
   if (ctxt.timer)
   return 0;
}