UNIX C Language [Résolu]

Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 novembre 2014
- - Dernière réponse : RMEU
Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 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
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
3
Merci
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);

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 191 internautes nous ont dit merci ce mois-ci

Commenter la réponse de katsankat
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
58
0
Merci
pourquoi ne pas invoquer ta commande shell ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 novembre 2014
0
Merci
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
Commenter la réponse de RMEU
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
30
0
Merci
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
Commenter la réponse de coucou747
Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 novembre 2014
0
Merci
Merci pour la réponse, je vais essayer cette solution

RMEU
Commenter la réponse de RMEU
Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 novembre 2014
0
Merci
Bonjour Katsankat,

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

Bon week-end

RMEU
Commenter la réponse de RMEU
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
10
0
Merci
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).
Commenter la réponse de cs_rt15
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
0
Merci
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.
Commenter la réponse de katsankat
Messages postés
31
Date d'inscription
mercredi 10 avril 2013
Statut
Membre
Dernière intervention
17 novembre 2014
0
Merci
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
Commenter la réponse de RMEU