9
votes

Comment puis-je vérifier si mon programme a des données de la conduite de données

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.


1 commentaires

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.


6 Réponses :


3
votes

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.

Edit: Je vois que je vais devoir mettre l'accent sur la partie aussi 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.


1 commentaires

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.



3
votes

Essayez "homme isatté", je pense que cette fonction vous dira si vous parlez à l'utilisateur ou non.


0 commentaires

2
votes

Utiliser isatty pour détecter que STDIN provient d'un terminal plutôt que d'une redirection.


0 commentaires

1
votes

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.


0 commentaires

12
votes

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;
}


0 commentaires

0
votes

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).

Pour un exemple de code à l'aide de SELECT sur STDIN Voir:

Comment vérifier si STDIN est toujours ouvert sans Blocage?


0 commentaires