Insérer du code shell dans un programme C ou C++ et vis versa
Résolu
hymenoptera
Messages postés
37
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
Je lance un script shell pour récupérer des informations sur une application (perf stat -e instructions,r12E etc...).
je stock ces informations dans des variables shell et souhaite utiliser ces variables pour faire un calcul (soit en C, C++, Fortran, Python ou n'importe...)
Ma question : Comment faire pour récupérer les variables d'un script shell et les utiliser dans un programme C sachant que je lance la commande "perf stat" dans une boucle. C'est à dire qu'à chaque fois que je récupère des infos je fais le calcul en C (ou autre) et j'affiche le résultat en temps réel.
Sinon avez-vous une meilleur façon de faire?
Merci bien
Je lance un script shell pour récupérer des informations sur une application (perf stat -e instructions,r12E etc...).
je stock ces informations dans des variables shell et souhaite utiliser ces variables pour faire un calcul (soit en C, C++, Fortran, Python ou n'importe...)
Ma question : Comment faire pour récupérer les variables d'un script shell et les utiliser dans un programme C sachant que je lance la commande "perf stat" dans une boucle. C'est à dire qu'à chaque fois que je récupère des infos je fais le calcul en C (ou autre) et j'affiche le résultat en temps réel.
Sinon avez-vous une meilleur façon de faire?
Merci bien
A voir également:
- Shell c++
- Classic shell - Télécharger - Personnalisation
- Secure shell - Télécharger - Divers Web & Internet
- Shell infrastructure host c'est quoi - Guide
- Shell startup windows 10 - Guide
- Shell do while ✓ - Forum Shell
1 réponse
C'est bon j'ai trouvé, pour ceux que ça intéresse je vais poster la solution que je cherchais :
il faut inclure <cstdlib> pour le C++ ou <stdlib.h> pour le C
utiliser
au lieu du simple
déclarer mes arguments (ici j'ai déclaré 2 arguments):
exécuter mon programme en passant les deux variables, que je récupère du script, comme arguments :
arg1 sera égale à $VARIABLE1 que j'ai récupéré de mon script, pareil pour arg2 qui sera égale à $VARIABLE2
y a plus qu'à exécuter mon programme dans la boucle de mon script comme ceci :
Bonne journée à tous :)
il faut inclure <cstdlib> pour le C++ ou <stdlib.h> pour le C
utiliser
main (int argc, char ** argv)
au lieu du simple
main()
déclarer mes arguments (ici j'ai déclaré 2 arguments):
int arg1= atoi(argv[1]);
int arg2= atoi(argv[2]);
exécuter mon programme en passant les deux variables, que je récupère du script, comme arguments :
g++ mon_programme.C
./a.out $VARIABLE1 $VARIABLE2
arg1 sera égale à $VARIABLE1 que j'ai récupéré de mon script, pareil pour arg2 qui sera égale à $VARIABLE2
y a plus qu'à exécuter mon programme dans la boucle de mon script comme ceci :
#! /bin/bash
VARIABLE1=1
VARIANLE2=2
g++ mon_programme.C
for i in $(seq 1 50) ; do
perf stat -e instructions mon_application
./a.out $VARIABLE1 $VARIABLE2
done
Bonne journée à tous :)
Pour info, en C, atoi() est obsolète. Il vaut mieux utiliser strtol().
En C++, on utilise plutôt les méthodes de la classe String.
Tu peux même tester la date de ton fichier mon_programme.C par rapport au a.out pour éviter une recompilation inutile. Et au cas où, tu peux mettre -o nomProgramme dans g++ pour mettre un vrai nom de programme (plutôt que a.out).
Merci d'avoir pris le temps de répondre.
Il me semble que strtol est utilisé pour les types "long int" même chose pour "atol", alors que "atoi" c'est pour les simples int. Dans un programme assez gourmand en memoir ce n'est pas négligeable.
C'est intéressant de tester la compilation avec la date, je vais voir comment on peut faire ça. Merci pour le tuyau ;)
Même dans un exemple ce fameux "a.out" fait encore parler de lui
Sauf que atoi() est obsolète...
De plus, ce n'est pas parce qu'il est utilisé pour les long que cela ne fonctionne pas avec les int.
Et enfin, la taille d'un long int et d'un int est la même sur pas mal de plateforme :-).
Pour le test, tu peux regarder du côté de makefile. Ca nécessitera la création d'un fichier supplémentaire (contenant 2 lignes). N'hésite pas si tu veux plus de précision.