Appel de commandes UNIX - C - Programmation
Marsh Posté le 20-09-2005 à 16:20:47
DocGero a écrit : peut-on faire appel a une commande UNIX (par exemple ping) dans un programme C, et en exploiter la reponse? |
system() est standard. Pour exploiter la réponse (stdout), le plus simple est de rediriger la sortie standard vers un fichier texte et de traiter celui-ci ensuite.
Sous unixoïde, il y a aussi la possibilité d'utiliser les pipes... (popen() etc.). Ce n'est plus du C standard.
Marsh Posté le 20-09-2005 à 17:09:26
ok, merci pour cette reponse rapide...
J'ai trouve la liste des system calls, mais pas de trace de 'ping' (c'est la commande dont j'ai besoin)... J'ai aussi vu qu'il etait possible d'ajouter ses propres appels, mais cette solution ne m'interesse pas car le programme devient fortement dependant de l'environnement d'execution. Peut etre vais me rabbatre sur un script shell appelant ping, puis mon programme C ... pas tres elegant... d'autres idees?
Marsh Posté le 20-09-2005 à 17:18:19
Euh, le but de system() c'est justement d'utiliser l'environnement.
Si tu appelles une commande du système, par définition, tu dépends de l'environnement. Si tu ne veux pas de cette dépendance, il te reste à développer toi-même ton propre ping à partir des fonctions C.
D'autant plus que tu es inconstant dans ton raisonnement : tu souhaites être indépendant de ton environnement, mais tu cites l'utilisation d'un script shell comme possible solution... ce qui revient au même.
Marsh Posté le 20-09-2005 à 17:43:15
Ok, surement je ne comprends pas toute la subtilite de l'affaire (je ne suis ni programmeur, ni expert es OS): d'ou mon post.
Ce que j'ai voulu dire - mais surement me suis je mal exprime - c'est que ping n'etant pas un appel system standard (en tout cas il n'est pas donne par 'man 2 syscalls'), et - sauf bien sur erreur de ma part- il faut l'ajouter "a la main" et editant un certain fichier entry.S, et ce sur chaque machine sur lequel le programme s'executera. En revanche, je sais que toutes les machines sur lesquelles doit s'executer le porgramme embarquent bash, donc sauront interpreter le script. Voila, peut-etre je me trompe, aussi je vous remercie pour toute lumiere sur le sujet.
Marsh Posté le 20-09-2005 à 18:05:50
Sauf si l'administrateur lui a enlevé les droits, ping est un binaire livré en standard sur tous les Unix.
Il est d'ailleurs dans /usr/sbin par défaut, lieu où se situent les utilitaires systèmes.
Tu peux donc l'utiliser de manière relativement fiable avec un system("/usr/sbin/ping arguments" );
Pour fiabiliser la chose, vérifie simplement que le fichier existe et est lisible, avec stat() par exemple.
stat() est une fonction P90, elle devrait fonctionner sur n'importe quel Unix, par contre sous d'autres système c'est moins sûr. Ce qui, au point où tu en es (exécuter un binaire Unix), ne devrait poser aucun souci.
Marsh Posté le 20-09-2005 à 18:20:24
system() et un appel systeme (syscall) c'est pas la meme chose hein ?
Marsh Posté le 20-09-2005 à 18:23:19
Ah oui, je viens de faire un man syscall pour voir...
Clairement c'est pas ce que tu recherches, DocGero.
Marsh Posté le 20-09-2005 à 18:54:10
DocGero a écrit : J'ai trouve la liste des system calls, mais pas de trace de 'ping' (c'est la commande dont j'ai besoin)... |
Gni ? Qui a parlé de system calls ?
Je parle de la fonction system() (man 3 system) qui s'utilise par exemple comme ça :
system ("ping 192.168.0.1 > out.txt" ); |
On parle bien de langage C?
Marsh Posté le 21-09-2005 à 11:52:57
Ok, j'ai compris la difference... c'est bien system() dont j'ai besoin.
En tout cas, merci pour ces reponses claires...
Marsh Posté le 20-09-2005 à 15:07:12
Question peut-etre naive, mais pour laquelle je n'arrive pas a trouver de reponse : peut-on faire appel a une commande UNIX (par exemple ping) dans un programme C, et en exploiter la reponse?
Par avance merci.