IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tester l'entrée standard avec l'appel système STAT


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 26
    Par défaut Tester l'entrée standard avec l'appel système STAT
    Bonjour ,

    Voila mon problème , je doit pouvoir ,grâce à l’appel système stat, savoir si l’entrée standard est redirigée depuis un fichier.

    L'usage est : ./main arg1 arg2 < arg3

    J'ai beau essayé tous sorte de chose rien y fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	struct stat sts;
    	if(stat(argv[0] ,&sts) ==-1){
    		printf("Erreur stat\n");
    		exit(0);	
    	}
    J'aimerais bien avoir un petit coup de pouce

    Merci

  2. #2
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Bonjour,

    l'entrée standard est stdin. Tu peux en récupérer le file descriptor (fd) grâce à fileno(stdin).

    Pour savoir si l'entrée standard est un terminal tu as isatty. Si tu n'as pas à faire à un terminal tu peux ensuite essayer de faire un fstat sur le fd de l'entrée standard et utiliser le membre st_mode avec S_ISFIFO pour savoir si l'entrée vient d'un pipe, S_ISREG si elle vient d'un fichier, ...

    EDIT: tant qu'à faire quelques liens vers la doc de la glibc
    déterminer les attributs d'un fichier

    déterminer le type de fichier

    doc fonction fileno

  3. #3
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 26
    Par défaut
    Merci de ta réponse ^^

    Mais , toujours rien , j'ai peut être mal compris ce que tu ma dit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	struct stat sts;
    	int st = fileno(stdin);
    	if(fstat(st ,&sts) ==-1){
    		printf("Erreur stat\n");
    		exit(0);	
    	}
     
    	if(S_ISREG(sts.st_mode)){
    		printf("redirection interdite!\n");
    		exit(0);	
    	}
    Je rentre en console , ./main fichier1 fichier2 < fichier3
    j'ais également essayé avec S_ISFIFO , rien n'y fait

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Un petit programme d'exemple s'impose
    istty.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
     
    int main(void)
    {
      if (isatty(fileno(stdin))) {
          printf("stdin est un terminal\n");
      } else {
        /* On vérifie que l'erreur est bien de ne pas avoir trouvé un TTY
            et pas une autre autre erreur auquel cas on quitte */
        if (errno!=ENOTTY) {
          perror("isatty a échoué");
          exit(EXIT_FAILURE);
        }
     
        struct stat stats;
     
        if (fstat(fileno(stdin), &stats)!=0) {
          perror("fstat a échoué");
          exit(EXIT_FAILURE);
        }
     
        if (S_ISREG(stats.st_mode)) {
          printf("stdin est un fichier\n");
        } else if (S_ISFIFO(stats.st_mode))	{
          printf("stdin est un tube\n");
        } else {
          printf("stdin est autre chose qu'un fichier ou un tube\n");
        }
      }
     
      return 0;
    }
    ensuite dans un terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ~/Projects/istty> gcc -Wall -Wextra -g -o istty istty.c 
    ~/Projects/istty> ./istty 
    stdin est un terminal
    ~/Projects/istty> ./istty < test
    stdin est un fichier
    ~/Projects/istty> ls | ./istty 
    stdin est un tube
    ~/Projects/istty> ./istty < /dev/null
    stdin est autre chose qu'un fichier ou un tube
    EDIT: en relisant je remarque que j'ai oublié de vérifier errno après l'appel à isatty, il faudra le rajouter pour être complet.
    Rajouté.

  5. #5
    Membre averti
    Homme Profil pro
    Informatique
    Inscrit en
    Mars 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 26
    Par défaut
    Je te remercie de ton aide , l'exemple ma réellement bien fait comprendre

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/10/2011, 23h38
  2. Réponses: 2
    Dernier message: 13/06/2008, 19h15
  3. [CGI-BIN] Problèmes avec les appels systèmes
    Par ozyamdias dans le forum Apache
    Réponses: 1
    Dernier message: 27/08/2007, 17h17
  4. Réponses: 2
    Dernier message: 10/02/2007, 12h07
  5. Réponses: 1
    Dernier message: 06/12/2006, 20h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo