IM rédige un programme qui devrait lire l'entrée via STDIN, j'ai donc le contact suivant.
gunzip -c file.gz |./a.out #should work ./a.out #should exit program with nice msg.
6 Réponses :
Passer STDIN à sélectionner () ou Sondage () devrait vous dire si l'entrée attend. Sous de nombreux osés, vous pouvez également dire si STDIN est un TTY ou un tuyau. P>
Edit: Je vois que je vais devoir mettre l'accent sur la partie aussi em> du test TTY. Une FIFO n'est pas un tty, mais il pourrait y avoir une entrée prête pour une durée indéterminée. P>
Je pense que l'OP voulait juste couvrir la ligne déroulante-commande-ligne-et-merveille-why-it-it- "accroche". Essayer probablement de réparer un bug de PEBKAC. Assis là attendre sur une FIFO ou une autre pipe irait bien.
Essayez "homme isatté", je pense que cette fonction vous dira si vous parlez à l'utilisateur ou non. P>
Utiliser isatty code> pour détecter que STDIN provient d'un terminal plutôt que d'une redirection. P>
Voir la fonction "ISATTY" - si STDIN est un terminal, vous pouvez sauter de la lecture. Si ce n'est pas un terminal, vous obtenez des données de canalisations ou redirigées et que vous pouvez lire jusqu'à EOF. P>
Depuis que vous utilisez les pointeurs de fichiers, vous aurez besoin des deux IsatTy () code> et
fileno () code> Pour ce faire:
#include <unistd.h>
int main(int argc, char* argv[])
{
if(isatty(STDIN_FILENO))
{
fprintf(stderr, "A nice msg.\n");
exit(1);
}
/* carry on... */
return 0;
}
Une option supplémentaire que vous obtenez avec SELECT () définit un délai d'attente pour la lecture de STDIN (en ce qui concerne la première lecture de STDIN ou consécutive de STDIN). p>
Pour un exemple de code à l'aide de SELECT sur STDIN Voir: P>
Comment vérifier si STDIN est toujours ouvert sans Blocage? P>
Pour le compte rendu, le programme n'est pas suspendu; C'est simplement attendre l'entrée. Si vous envoyez un EOF (Ctrl-D sur la plupart des plates-formes), il est interprété comme si l'entrée s'est terminée tôt.