forker un terminal - C++ - Programmation
Marsh Posté le 28-03-2003 à 15:03:50
Il y a plein de moyens de le faire, mais ce n'est pas du tout portable.
Marsh Posté le 29-03-2003 à 11:38:40
Sous Debian tu peux lancer facilement un nouveau terminal en utilisant x-terminal-emulator. La difficulté après, c'est de récupérer le tty. Tu peux lancer par exemple un autre programme dans le terminal, qui va aller lire une FIFO sur le disque et réafficher tout ce qu'il lit dans le terminal. Le programme déjà lancé n'a donc qu'à écrire dans cette FIFO et ça sera affiché.
Marsh Posté le 29-03-2003 à 14:05:15
ok, merci,
ça à l'aire d'être plus ou moins ce ke je cherchai mais concretement dans l'exemple si dessus ça resemblera a quoi?
(pour les FIFO c'est ok, mais c'est plustot la manière d'utiliser "x-terminal-emulator" qui pose prob, un petit exemple dans le contexte me metterait les idées bien en place)
Marsh Posté le 31-03-2003 à 11:51:06
Bin tu lances x-terminal-emulator -e tonprogramme.
Marsh Posté le 01-04-2003 à 01:22:14
ok merci,
c'est que y'a tellement d'options que j'étai pas sorti de l'auberge....
Comment je donne des paramètres (argv) au lancement de mon prog?
Marsh Posté le 01-04-2003 à 01:45:49
Tu peux faire une petite recherche sur google pour cette dernière question, je pense que tu trouveras ton bonheur...
Sinon, tres rapidement, voici l'idée
int main(int argc, char* argv[]){
...
}
argc représente nombre d'argument et argv est le tableau de ces arguments, la première case étant rempli par le nom de l'exécutable. Tu peux faire une boucle while(argv[i] != NULL ) pour pas aller n'importe ou bien t'appuyer sur argc ds une boucle for ( for ( i = 1 ; i < argc ; i++) )
Si tu veux aller un peu plus loin, tu peux regarder du coté de getopt() !
@+
Marsh Posté le 01-04-2003 à 12:30:24
Peak a écrit : Comment je donne des paramètres (argv) au lancement de mon prog? |
man execvp ?
Marsh Posté le 01-04-2003 à 13:18:59
yep, pour le exec c'est ok mais le prob c'est que je voudrai le fair avec x-terminal-emulator -e tonprogramme.
je veux donner des param au lancement de
./tonprogramme param1 param2
si je fait:
systeme("x-terminal-emulator -e tonprogramme param1 param2" );
il a pas l'air d'adorer.
Marsh Posté le 01-04-2003 à 14:31:36
Peak a écrit : si je fait: |
C'est censé marcher. Tu es sûr qu'il trouve bien le chemin vers le programme ?
Marsh Posté le 01-04-2003 à 15:43:55
en fait ça marche ,
desolé mais je m'était trompé de prob en fait ce ke je veux fait c'est passer deux struct au programme appelé je me disais que comme argv est un char** ça ne devrai pas poser de prob en donnant l'adrs de ma struct a argv[1]et argv[2] (du moment ke je connait la taille de la struct dans le prog destination).
Le prob ce'st que "systeme" recoit un const char comme param et que evidement l'adrs des mes structs n'est pas constant.
J'ai pensai me débrouiller en faisant un truc du style (j'ai pas encore testé) :
Code :
|
je pense ke ça devrai marché, je sais pas si y'a mieux...?
Marsh Posté le 01-04-2003 à 15:47:25
Comment veux-tu accéder à une adresse qui sera dans un autre programme ? Chaque programme a son propre espace d'adressage !
Marsh Posté le 01-04-2003 à 15:54:23
oops,
comment je fait alors?
(j'aimerai vraiment eviter d'utiliser un fichier temporaire)
ps: pourtant si je fait
sprintf(systarg, "x-terminal-emulator -e tonprogramme %p %p", &struct1, &struct2);
se sera bien une chaîne de caractère y suffira juste de decoder le string à l'arriver et d'utiliser l'adrs specifié par &struct1 et &struct2.
Marsh Posté le 01-04-2003 à 16:10:18
Peak a écrit : oops, |
Et hop, segmentation fault garanti.
Exercice : comprendre pourquoi, en lisant des cours de base sur Unix, la MMU et le multitâche préemptif.
Si tu veux éviter d'utiliser un fichier temporaire, utilise un pipe nommé.
Marsh Posté le 01-04-2003 à 16:33:27
Ouais mais une pipes nomé est sensé etre utilisé pour une communiquation inter processus or ici dans notre cas precis il n'est question que d'un procesus.
Avant de lancer mon prog avec xterm je n'avai pas se probs; mes deux structs avaient été assigné et contenai les infos necessaires dans le processus père et dans le processus fils mais tous les affichages se faisait sur le terminal ce ki ne m'arrangeai pas, donc c'est juste kands j'ai appelé xterm dans le procesus fils et que j'ai copier coller la partie conserné dans le prog appelé que je me suis retrouvé face a un prob de paramètres.
Il ne sagit donc pas d'IPC c'est une communiquation entre le processus fils et l'executable que celui-ci lance, ils font tout deux partie du même processus.
Est-il impossible de fair passer des arguments autre que string d'un exe à un autre sans fichiers suplementaires??
N'est il pas possible d'utiliser un zone mémoire utilisable par tout les executables kand ils le souhaitent??
(vous allez sans doute me dire d'aller relire ce qu'on dis sur la mémoire partagé (ce que je fait d'ailleur fair) mais utiliser une ipc quand il n'y a pas de raison étant donné qu'on communique entre deux partie d'un même procesuss me semble bizard??? )
Marsh Posté le 01-04-2003 à 16:34:31
ReplyMarsh Posté le 01-04-2003 à 16:39:14
Ce ne sont pas deux parties d'un même processus mais deux processus différents. Du moment que tu utilises fork+execve ou system, l'espace d'adressage n'a plus rien à voir.
Si tu tiens à ce que tes structures restent en mémoire, oui, il faut des segments IPC et rien d'autre ne résoudra ton problème.
Marsh Posté le 28-03-2003 à 13:46:36
Je voudrai forker un processus mais que les ecriture sur stdout ne se fasse pas sur une consol unique.
Je voudrai qu'une nouvelle consol soit créé juste après le fork et que les messages soit affiché sur celle-ci.
Je ne sais pas si c'est posible ni si c'est portable sur les different distrib de linux??
Message édité par peak le 28-03-2003 à 13:48:04