tu veux dire savoir si ton entré standard est un pipe, ou un fichier ou un tty ?
basiquement, tu ne peux pas le savoir.
et je pense qu'avec un pipe les choses vont etre compliqué parceque le shell a fermer l'access au terminal et je pense pas que tu puisse réouvrir l'access au tty (seul root doit avoir le droit de faire ca. C'est une des raisons pour lesquels xterm est suid root)
cependant, tu peux le faire autrement facilement si foo n'utilise pas l'entré standard. Un tube nommé pour ferait l'affaire. Un exemple :
mkfifo /tmp/tata
grep zogzog unfichier > /tmp/tata &
diff /tmp/tata - < unfichier
Si ton programme lit l'entré standard. alors il faut peut etre gérer les descripteurs de fichier a la main, en faisant comme dans un shell sauf que l'on ne ferme pas l'entré standard du processus qui deviendra a.out et on redirige la sortie du pipe de foo sur un descripteur de fichier qui n'est pas 0. Il faut alors passé en parametre au programme a.out le descripteur de fichier sur lequel il doit lire.
Note que je ne sais pas comment se passent les access en lecture au terminal dans ce cas. Les read sont généralement bloquant. j'imagine donc que la politique est FIFO.
Si tu as besoin d'un bout de code, je peux te fournir ca facilement.