Geralmente, testando se um filehandle relevante é anexado a um tty:
% perl -le 'print -t STDOUT ? "yes" : "no"'
yes
% perl -le 'print -t STDOUT ? "yes" : "no"' > out
% < out
no
%
Ou via C, algo como:
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
...
int foo;
if (ioctl(STDIN_FILENO, FIONREAD, &foo) == -1) {
printf("yes\n");
} else {
printf("no\n");
}