Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/05/2024, à 16:29

temps

[résolu] comment entrer les arguments dans execl en c++ ?

Bonjour, je vais récupérer les noms des applications et leurs arguments ensuite, je vais les faire s'exécuter avec execl voici le code

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <unistd.h>
 /**pour compiler g++ 'composeur.cpp'   -std=c++11 -Wall -Wextra -o 'composeur' ********************/
int main()
{
execl("joapp58", "joapp58", "100","20","10", NULL);
}

Le premier argument est bien pris, mais pas les 2 suivants, à moins que mes arguments soient pris en char alors que ce sont des int, je sais pas, mais je n'obtiens pas le même résultat que si je lance en terminal
est-ce que quelqu'un sait comment écrire le code ?
Cordialement

Dernière modification par temps (Le 08/05/2024, à 23:12)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#2 Le 07/05/2024, à 18:17

Nuliel

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Bonjour,
Déjà on est d'accord que tu veux exécuter le fichier "joapp58", situé dans le chemin joapp58?
Peux tu expliquer ce que tu veux faire? Veux tu appeler un autre programme depuis ton code C?

Une chaine de caractères fixe sera stockée dans une zone particulière, et c'est un pointeur vers la chaine qui sera utilisé.

Sinon je mets le man ici:

man execl a écrit :

       int execl(const char *pathname, const char *arg, ...
                       /* (char  *) NULL */);
...
   l - execl(), execlp(), execle()
       The const char *arg and subsequent ellipses can be thought of as  arg0,
       arg1, ..., argn.  Together they describe a list of one or more pointers
       to null-terminated strings that represent the argument  list  available
       to  the  executed  program.   The first argument, by convention, should
       point to the filename associated with the  file  being  executed.   The
       list  of  arguments  must  be  terminated by a null pointer, and, since
       these are variadic functions, this pointer must be cast (char *) NULL.

Dernière modification par Nuliel (Le 07/05/2024, à 18:18)

Hors ligne

#3 Le 07/05/2024, à 18:38

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Bonjour,
Merci pour la réponse, je vais bien la lire pour comprendre et chercher à assimiler.
Oui, il s'agit bien de lancer plusieurs exécutables à partir d'un exécutable qui questionne parmi un choix d'exécutables et regroupe les exécutables et leurs arguments en int
Le système actuellement ne stoke pas les arguments, mais les demande dans le terminal, le but est qu'il regroupe les informations, crée les fichiers nécessaires puis enfin crée le fichier final qui sera un fichier audio.
Je reviens après,
Concernant les chemins, en fait je sais que la première valeur doit indiquer le chemin, mais comme l'exécutable est dans le répertoire, j'ai indiqué directement le nom de l'exécutable, ça marche, mais je ne suis pas certain que c'est ce qu'il faut faire, j'ai trouvé cette technique avec un exemple ls que j'ai testé

Dernière modification par temps (Le 07/05/2024, à 18:44)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#4 Le 07/05/2024, à 18:44

Nuliel

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Ok, mais ces autres exécutables, c'est toi qui les a fait en C? Si oui, pourquoi les avoir séparés?

Dernière modification par Nuliel (Le 07/05/2024, à 18:44)

Hors ligne

#5 Le 07/05/2024, à 19:46

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Merci pour l'intérêt.J'ai créé une soixantaine d'exécutable qui dessinent chacun une forme acoustique particulière, ses formes s'ajuste en sonorité à l'aide d'arguments.
La démarche est d'écrire un outil qui permette aux compositeurs de créer des fichiers audio en sélectionnant les formes qu'ils désirent.

En détail, si temps et intérêts, je défends l'idée depuis 1993 que chaque évènement possède sa propre base de temps, cette idée m'a permis de réguler de nombreux systèmes, cette idée est issue de l'enseignement qui m'a appris à associer les idées comme ça, c'est notre culture en opposition à la culture anglo-saxone enseignée aujourd'hui. Cela se traduit en acoustique que chaque forme acoustique possède sa propre base de temps, que les lois et les dimensions qui produisent les sons sont à mettre en évidence. Pour ce faire j'ai créer un format audio en format texte, c'est ce qui est généré à la première étape dans l'appli, puis ce format audio en format texte, est mouliné pour créer un format audio conventionnel reconnu par les lecteur audio

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <unistd.h>
#define Appli_Max 10
 /**pour compiler g++ 'composeur.cpp'   -std=c++11 -Wall -Wextra -o 'composeur' ********************/
int main()
{
char appli[Appli_Max];
int j;
std::cout << "Indiquez le nombre de formes à associer : "; std::cin >> j;
for (int i = 0; i < j; i++) { 
std::cout << "Indiquez le nom qui génère la forme à associer : "; std::cin.getline (appli, Appli_Max);//std::cin >> appli;
execl(appli, appli, NULL);
if (i == 0){execl("executable", "executable", NULL);;}
if (i > 0){execl("executable1", "executable1", NULL);;}
}
//execl("joapp58", "joapp58", "100","20","10", NULL);
}

ça compile mais je n'ai pas les arguments

Cordialement

Dernière modification par temps (Le 07/05/2024, à 22:15)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#6 Le 07/05/2024, à 22:24

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Je poste en résolu, il y a beaucoup de compromis que j'essaierai d'arranger plus tard, mais comme pour l'instant j'ai d'autres priorité (je dois détailler les formes), cette version fera l'affaire.
voici le code qui fonctionne bien :

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <unistd.h>
#define Appli_Max 10
 /**pour compiler g++ 'composeur.cpp'   -std=c++11 -Wall -Wextra -o 'composeur' ********************/
int main()
{
char appli[Appli_Max];
int j;
std::cout << "Indiquez le nombre de formes à associer : "; std::cin >> j;
for (int i = 0; i < j; i++) { 
std::cout << "Entrez ./ puis indiquez le nom qui génère la forme à associer : "; std::cin.getline (appli, Appli_Max);
execl(appli, appli, NULL);
if (i == 0){execl("executable", "executable", NULL);;}
if (i > 0){execl("executable1", "executable1", NULL);;}
}

}

Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#7 Le 07/05/2024, à 23:06

Nuliel

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Mais ça veut dire que chaque ligne de ton "script" c'est un appel à un exécutable? Il va être super lent ton programme!
Si tu as créé tous ces exécutables, ce serait à mon avis plus logique de tout regrouper dans un seul exécutable.
Fais attention parce que tu vas te retrouver avec un code qui sera très difficile à remanier pour le remettre au propre, pour peu qu'il soit pas bien commenté ce sera un enfer et ce sera équivalent à le recommencer.

Dernière modification par Nuliel (Le 07/05/2024, à 23:06)

Hors ligne

#8 Le 08/05/2024, à 03:08

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Merci pour la remarque aux tests il est très rapide, les raisons en sont que ce sont des taches très simple, il n'y pas de calcul, nous effectuons des suites qui dessinent les formes acoustiques choisies. Imaginer une partition musicale construite sur les lois physiques, qui en plus sont en grande partie identiques à celle de l'entendement. C'est un format musicale qui ouvre l'esprit, c'est un format musicale à la mode du siècle des lumière en opposition aux formats musicaux actuelles qui apprennent à croire. Il faut bien comprendre que l'important pour le compositeur, ce n'est pas la vitesse à laquelle il écrit sa musique, car le lecteur audio la lira toujours à la même vitesse, ce qui est important pour le compositeur c'est d'avoir un outil qui lui permette de manipuler les lois physiques pour pouvoir exprimer tout l'art de son entendement. D'ajouter à cela que ce format audio écrit en mode texte, pourra se transmette juste en donnant le nom des appli avec leurs arguments le tout compressé, donc rapide à transmettre, peu de place de stockage, peu de consommation d'énergie ...
Une fois le concept assimilé, il est certain qu'il va évoluer, avec les formes, autre format audio conventionnel généré, outil graphique plus facile sur des formes ciblées pour contact lumineux ...
ici ce n'est que l'étincelle transmis par les anciens, au libre d'allumer le feu avec, pour nous réchauffer.
Concernant le code, il est certain qu'une personne formaté à la mode anglo-saxone, chinoise(la chine est vaste de nombreuses cultures, il y a des exceptions) ou nord-africain ne pourra pas percevoir le vital, l’essentiel. Il ne pourra qu'imiter pour constater que ça marche.
Mais ceux qui ont encore les bases de la culture française, ou encore ceux des pays européen qui ont gardés les bases du moment du siècle des lumières, ou encore certaines petites cultures africaines (en remarquable une qui n'a qu'une nuance de gris et de blanc, pas de couleur dans son langage) et certainement d'autres cultures qui me sont inconnues pourrons adapter et aussi améliorer le code. Le prochain travail, c'est de commenter et essayer de faire que l'outil soit le plus facile possible à utiliser. En d'autres mots, nous commençons tous d'un point à un autre, l'important ce n'est pas le point de départ ou le point d'arrivée funeste, l'important est ce qui reste, ce qui reste, c'est la manière de se déplacer entre ces deux points
Cordialement

Dernière modification par temps (Le 08/05/2024, à 23:25)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#9 Le 08/05/2024, à 21:54

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Oups, j'avais mis résolu, mais ce n'est pas le cas. La boucle déroule sans attendre. Comme j'avais fait les essais en indiquant 1 je ne me suis pas aperçu du problème. C'est quand j'ai voulu demander l'association de plusieurs formes que le problème est apparu. j'ai fait un test qui montre bien ce qu'il se passe avec :

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <unistd.h>
#define Appli_Max 10
#include <sys/types.h>
#include <sys/wait.h>
 /**pour compiler g++ 'composeur.cpp'   -std=c++11 -Wall -Wextra -o 'composeur' ********************/
int main(int, char**)
{
char appli[Appli_Max];
int j;
std::cout << "Indiquez le nombre de formes à associer : "; std::cin >> j;
for (int i = 0; i < j; i++) { 
std::cout << "Entrez ./ puis indiquez le nom qui génère la forme à associer : "; std::cin.getline (appli, Appli_Max);
std::system (appli);//(appli, appli, NULL);
std::cout << "Tapez sur entrée pour que l'application transforme le fichier texte ";
//if (i == 0){std::system ("./executable");}//{execl("executable", "executable", NULL);}
//if (i > 0){std::system ("./executable1");}//{execl("executable1", "executable1", NULL);}
std::cout << "Tapez sur entrée pour poursuivre ";
}

}

la boucle defile sans attendre, je pense que la solution est avec la fonction wait mais je ne sais pas la manipuler et je n'arrive pas à trouver d'exemple que je comprends
la doc est là https://pubs.opengroup.org/onlinepubs/7 … /wait.html

Dernière modification par temps (Le 08/05/2024, à 22:32)


Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne

#10 Le 08/05/2024, à 23:10

temps

Re : [résolu] comment entrer les arguments dans execl en c++ ?

Bonjour, Incroyable en cherchant à comprendre comment ça fonctionne sans le vouloir j'ai écris un code qui marche, le Dieu des ignorant a été courtois voici le code, qui marche, mais je suis incapable de dire pourquoi ce code fonctionne alors que dans le précédent plus évolué la boucle ne voulais pas s'arrêter. Je poste en résolu pour de bon cette fois ci

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <unistd.h>
//#define Appli_Max 12
#include <sys/types.h>
#include <sys/wait.h>

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>




 /**pour compiler g++ 'composeur.cpp'   -std=c++11 -Wall -Wextra -o 'composeur' ********************/
int main(void) {

char appli[12];
int j,a;
std::cout << "Indiquez le nombre de formes à associer : "; std::cin >> j;
for (int i = 0; i < j; i++) { 
std::cout << "Entrez ./ puis indiquez le nom qui génère la forme à associer : "; std::cin>>appli;//.getline (appli, Appli_Max);
std::system (appli);//(appli, appli, NULL);
std::cout << "Attendre 5s, puis tapez sur 1 pour que l'application transforme le fichier texte ";std::cin>> a;
if (i == 0){std::system ("./executable");}//{execl("executable", "executable", NULL);}
if (i > 0){std::system ("./executable1");}//{execl("executable1", "executable1", NULL);}
std::cout << "Attendre 5s, puis tapez sur 1 pour poursuivre ";std::cin>> a;
}

}

Parce que l'USB bootable est le support des systèmes experts,
Parce que l'USB bootable contient sa propre image au démarrage.
L'USB bootable permet de créer un monde à la dimension de son imagination
https://www.letime.net

Hors ligne