isatty
проверяет tty, не трубу. Вместо этого используйте fstat(STDIN_FILENO, &sb)
и проверьте на S_ISFIFO(sb.st_mode)
.
Чтобы проверить, есть ли что-либо "в" stdin, которое вы могли бы прочитать, вы используете, например, poll(2)
с маской события POLLIN
.