UNIX C Language

Résolu
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014 - 17 nov. 2011 à 09:46
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014 - 21 nov. 2011 à 08:26
Bonjour,

Quelqu'un pourrait-il me donner le nom d'une fonction C qui prend un nom de fichier comme paramètre et retourne le type de fichier? En bref, l'équivalent de la commande shell file.
Pas la fonction stat car on ne peut pas savoir si le fichier compressé ou pas or c'est cette information qui m'intéresse.

Merci d'avance.

RMEU

9 réponses

katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
18 nov. 2011 à 15:35
popen() est probablement le plus simple à mettre en oeuvre pour lancer une commande et récupérer la sortie standard.

  FILE *in;
  char buff[512];
 
  if (!(in = popen("ls -la", "r"))) {
    return;
  }
 
  while (fgets(buff, sizeof(buff), in) != NULL ) {
    printf("Output: %s", buff);
  }

  pclose(in);
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
17 nov. 2011 à 10:46
pourquoi ne pas invoquer ta commande shell ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
17 nov. 2011 à 10:50
Car je préfère ne pas sortir du programme. Sinon, je peux exécuter la commande file à partir du programme, mais comment récupérer l'output de la command?


RMEU
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 42
17 nov. 2011 à 11:00
Bonjour,

avec de la redirection de flux (voir la fonction dup2) et les fonctions associées à execve, tu peux faire un truc du genre :

duppliquer stdout
forker
dans le fils, lancer ta commande
dans le père, lire le stdout du fils

Les exemples d'utilisations de execve sont nombreux.

Cordialement,

Maxime
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
17 nov. 2011 à 11:16
Merci pour la réponse, je vais essayer cette solution

RMEU
0
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
18 nov. 2011 à 17:04
Bonjour Katsankat,

Ceci me semble être la meilleure solution à mon problème.

Bon week-end

RMEU
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
19 nov. 2011 à 21:03
Salut,

Pour info, le man est assez précis sur ce que fait file, elle ne semble pas excessivement dur recoder.

1/ D'abord stat.
2/ Puis il cherche des "nombres magiques" répertoriés dans /usr/share/magic.
3/ Si c'est un fichier ASCII, il cherche des mots contenus dans names.h.

Les tests de systèmes de fichiers sont basés sur l'examen de la sortie de l'appel-système stat(2) . Le programme vérifie si le fichier est vide, ou s'il s'agit d'un certain type de fichier spéciaux. Tous les types de fichiers connus appropriés présents sur votre système (sockets, liens symboliques ou tubes nommés (FIFOs) sur les systèmes qui les implémentent) sont reconnus lorsqu'ils sont définis dans le fichier d'entête du système sys/stat.h.

Les tests de nombres magiques sont utilisés pour vérifier des fichiers contenant des données dans des formats fixes particuliers. L'exemple type est un fichier binaire exécutable (programme compilé) a.out, dont le format est défini dans a.out.h, et peut-être aussi dans exec.h dans le répertoire d'inclusion standard. Ces fichiers contiennent un ``nombre magique'' qui indique au système d'exploitation UNIX que le fichier est un binaire exécutable, et qui donne le type précis parmi ces multiples types possibles. Le concept de ``nombre magique'' a été appliqué par extension aux fichiers de données. Tout fichier contenant un identificateur invariable a une place fixe dans le fichier peut d'habitude être décrit de cette façon. L'information sur ces fichiers est lue à partir du fichier magique /usr/share/magic.

Si un argument semble être un fichier ASCII, file essaie de deviner le langage dans lequel il a été ecrit. Les tests de langage recherchent des chaînes de caractères particulières (cf names.h) qui peuvent apparaître n'importe où dans les premiers blocs d'un fichier. Par exemple, le mot-clé .br indique que le fichier est probablement un fichier d'entrée troff(1) , comme le mot-clé struct indique un programme C. Ces tests sont moins fiables que les deux autres types de tests, et donc ils sont pratiqués en dernier lieu. Les routines de tests de langage testent également quelques types divers (comme les archives tar(1) ), et déterminent si un fichier de type inconnu doit être étiqueté `ascii text' (texte ascii) ou `data' (données).
0
katsankat Messages postés 571 Date d'inscription vendredi 30 décembre 2005 Statut Membre Dernière intervention 12 juillet 2012 3
19 nov. 2011 à 22:08
Effectivement j'ai regardé la source de file.c avant de répondre. La meilleure solution est de faire appel à ce binaire. Une tâche, un programme c'est ça l'esprit UNIX. Donc popen() ou fork mais on peut ré-écrire la roue et l'adapter en cours de chemin, chacun sa voie chacun est libre surtout s'il a le temps de l'être.
0
RMEU Messages postés 31 Date d'inscription mercredi 10 avril 2013 Statut Membre Dernière intervention 10 novembre 2014
21 nov. 2011 à 08:26
Bonjour,

Merci pout toutes ces réponses. J'ai opté pour la solution proposée par katsankat. Elle est déjà codée et testée et ... elle fonctionne.

Bonne journée

RMEU
0