Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2926 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  forker un terminal

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

forker un terminal

n°346490
peak
Posté le 28-03-2003 à 13:46:36  profilanswer
 

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.

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <sys/wait.h>
  6. int
  7. main (void)
  8. {
  9. pid_t pid_fils;
  10. do {
  11.  pid_fils = fork ();
  12. } while ((pid_fils == -1) && (errno == EAGAIN));
  13. if (pid_fils == -1) {
  14.  fprintf (stderr, "fork() impossible, errno=%d\n", errno);
  15.  return (1);
  16. }
  17. if (pid_fils == 0) {
  18.  /* processus fils */
  19.         printf("hello1\n" );  //affiche dans un nouveau terminal
  20.  return (0);
  21. } else {
  22.  /* processus père */
  23.  printf("hello0\n" );  //afficher dans le terminal de base
  24.  wait (NULL);
  25.  return (0);
  26. }
  27. }


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
mood
Publicité
Posté le 28-03-2003 à 13:46:36  profilanswer
 

n°346617
Jar Jar
Intaigriste
Posté le 28-03-2003 à 15:03:50  profilanswer
 

Il y a plein de moyens de le faire, mais ce n'est pas du tout portable.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°346829
peak
Posté le 28-03-2003 à 19:17:26  profilanswer
 

Pourai tu me donner un exemple sous debian?  

n°347116
Jar Jar
Intaigriste
Posté le 29-03-2003 à 11:38:40  profilanswer
 

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é.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°347176
peak
Posté le 29-03-2003 à 14:05:15  profilanswer
 

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)

n°348102
Jar Jar
Intaigriste
Posté le 31-03-2003 à 11:51:06  profilanswer
 

Bin tu lances x-terminal-emulator -e tonprogramme.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°348708
peak
Posté le 01-04-2003 à 01:22:14  profilanswer
 

:)  
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?

n°348714
Evadream -​jbd-
Posté le 01-04-2003 à 01:45:49  profilanswer
 

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() !
 
@+
 
 

n°348995
Jar Jar
Intaigriste
Posté le 01-04-2003 à 12:30:24  profilanswer
 

Peak a écrit :

Comment je donne des paramètres (argv) au lancement de mon prog?

man execvp ?


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°349033
peak
Posté le 01-04-2003 à 13:18:59  profilanswer
 

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.

mood
Publicité
Posté le 01-04-2003 à 13:18:59  profilanswer
 

n°349184
Jar Jar
Intaigriste
Posté le 01-04-2003 à 14:31:36  profilanswer
 

Peak a écrit :

si je fait:
systeme("x-terminal-emulator -e tonprogramme param1 param2" );
 
il a pas l'air d'adorer.

C'est censé marcher. Tu es sûr qu'il trouve bien le chemin vers le programme ?


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°349258
peak
Posté le 01-04-2003 à 15:43:55  profilanswer
 

en fait ça marche  :whistle: ,  
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 :
  1. char* systarg;
  2. sprintf(systarg, "x-terminal-emulator -e tonprogramme %p %p", &struct1, &struct2);
  3. system(sysarg);


 
je pense ke ça devrai marché, je sais pas si y'a mieux...?
 :bounce:  
 

n°349266
Jar Jar
Intaigriste
Posté le 01-04-2003 à 15:47:25  profilanswer
 

Comment veux-tu accéder à une adresse qui sera dans un autre programme ? Chaque programme a son propre espace d'adressage !


Message édité par Jar Jar le 01-04-2003 à 15:48:56

---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°349278
peak
Posté le 01-04-2003 à 15:54:23  profilanswer
 

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.

n°349296
Jar Jar
Intaigriste
Posté le 01-04-2003 à 16:10:18  profilanswer
 

Peak a écrit :

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.

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é.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°349337
Evadream -​jbd-
Posté le 01-04-2003 à 16:30:20  profilanswer
 

Escusez mon intervention totalement à l'ouest.

n°349342
peak
Posté le 01-04-2003 à 16:33:27  profilanswer
 

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??? )

n°349344
peak
Posté le 01-04-2003 à 16:34:31  profilanswer
 

Evadream -jbd- a écrit :

Escusez mon intervention totalement à l'ouest.


 ;) merci quand même  :D

n°349351
Jar Jar
Intaigriste
Posté le 01-04-2003 à 16:39:14  profilanswer
 

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.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
n°349378
peak
Posté le 01-04-2003 à 16:53:49  profilanswer
 

ok,  
je note ;) ;)  
merci!
:bounce:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  forker un terminal

 

Sujets relatifs
Linux terminal[C/Linux] Recuperer la taille d'un terminal
[Visual C++] Police 'Terminal' dans Rich Editun emulateur de terminal sous windows (style ceux qu il ya sous Unix)
Plus de sujets relatifs à : forker un terminal


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)