Nonblocking Get Character

You're doing IO incorrectly, the POSIX manual and all other related documentation explicitly says never to mix IO done on FILE *s and file descriptors. You have very blatantly broken this rule. This rule is in place because FILE *s use buffering an this means that after a call to fgets there will be nothing left for read to get because fgets already read all pending data into a buffer that is kept in the FILE * structure.

So since there's no way to check if an ISO C IO method will block, we have to use file descriptors only.

Since we know that STDIN_FILENO is just the number 0, we can use

fcntl (0, F_SETFL, O_NONBLOCK);

this will turn all reads on file descriptor 0 to non-blocking mode, if you want to use a different file descriptor so that you can leave 0 alone then just use dup to duplicate it.

This way, you can stay away from poll completely and implement ngetc as

ssize_t 
ngetc (char *c)
{
  return read (0, c, 1);
}

or better yet, a macro

#define ngetc(c) (read (0, (c), 1))

Thus you get a simple implementation for what you're looking for.

Edit: If you are still worried about the terminal buffering the input, you can always change the terminal's settings, see How to disable line buffering of input in xterm from program? for more information on how to do this.

Edit: The reason that one could not use fgetc instead of read is for the same reason that using fgets won't work. When one of the FILE * IO functions is run, it reads all the data from the associated file descriptor. But once that happens, poll will never return because it's waiting on a file descriptor that's always empty, and the same thing will happen with read. Thus, I suggest that you follow the advice of the documentation and never mix streams (IO using fgets, fgetc, etc.) and file descriptors (IO using read, write, etc.)