j'ai une commande qui retourne un affichage de confirmation sur le shell, comment est ce que je pourrai le recevoir dans un msg box gtk?
j'ai une commande qui retourne un affichage de confirmation sur le shell, comment est ce que je pourrai le recevoir dans un msg box gtk?
Bonsoir,
Tu aurais peut-être un petit bout de code à nous montrer ?
alors j'ai
ce code permet de copier un fichier avec l'exécution de la commande shell CP mais sous programme C, et l'argument "-i" pour le overwrite, si le fichier existe il te prévient avant écrasement, alors je veux récupérer ce message dans une fenetre avec OK ou Annuler car ce code est dans une application en GTK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 execl("bin\cp","cp","-i",path,destination);
En mode console ça risque de poser problème parce que la fenêtre gtk ne pourra pas s'ouvrir.
Tu pourrais utiliser les fonction Glib File Utilities pour copier un fichier au lieu d'utiliser exec...
Sinon, je ne vois pas trop, peut être en rediriger la sortie standard. Mais ça t'obligerai a parsser le prompt de la console et avec l'internationalisation ca risque d'être chaud...
le prof a exigé d'utiliser exec car il s'agit d'un tp systeme d'exploitation
Si tu ne peux pas faire autrement qu'utiliser exec(); alors la seule solution est d'écrire la sortie de la fonction dans un fichier sur le disque.
Tu lis ensuite ce fichier depuis Gtk+ et tu affiches son contenu.
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
Salut,
je me mêle sans doute de ce qui ne me regarde pas, mais ne pourrait-on pas passer par des tubes nommés ? il y a un chapitre entier dans mon vieux "Programmation Linux" chez Eyrolles, et ce qui m'a fait penser à ça c'est que je code en Lazarus et que pour récupérer les sorties de commandes du shell j'utilise un objet TProcess dont l'une des options s'appelle poUsePipes.
Exemple d'utilisation (en Pascal) :
Il suffirait donc de créer un tube nommé, d'y envoyer la sortie de la commande shell, et le programme gtk n'aura plus qu'à y aller pour la lire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 function ExecuteET(const ETcmd: string; cmdline: TStrings): Boolean; const READ_BYTES = 2048; var BytesRead: DWORD; Stream: TMemoryStream; NumBytes: LongInt; aProcess: TProcess; Res: integer; begin Res := 0; Result := False; try // http://wiki.lazarus.freepascal.org/Executing_External_Programs aProcess := TProcess.Create(nil); aProcess.Executable:= ETcmd; aProcess.Parameters.AddStrings(cmdline); aProcess.Options := [poUsePipes, poDefaultErrorMode]; aProcess.Execute; except Exit; end; if Res <> aProcess.ExitStatus then Result := True; // Get output written by shell command: ETout.Clear; // ETout est un objet TStringList BytesRead := 0; Stream := TMemoryStream.Create; try while True do begin // make sure we have room Stream.SetSize(BytesRead + READ_BYTES); // try reading it NumBytes := aProcess.Output.Read((Stream.Memory + BytesRead)^, READ_BYTES); if NumBytes > 0 // All read() calls will block, except the final one. then Inc(BytesRead, NumBytes) else BREAK // Program has finished execution. end; if BytesRead > 0 then begin Stream.SetSize(BytesRead); ETout.LoadFromStream(Stream); end; finally Stream.Free; end; end;
Hind4Dev tu pourrais nous montré l'énoncé ?
PS: Pardon, je suis curieux.
alors Jipété ta solution je pense m'est la plus favorable car utiliser un tube fait vraiment partie de mon programme système, veux tu bien m'expliquer plus STP
Gaulouis en ce qui est de l'énoncé est de créer un copier linux en utilisant des fonctions systèmes qu'on a vu selon le besoin sur linux et avec interface graphique en C, j'ai fini la copie maintenant pour ce qui est de la demande de confirmation d’écrasement en cas où le fichier existe déjà dans la cible, j'ai besoin de récupérer le message du shell
Effectivement la solution est de passer par des pipes. Mais vu que tu es obligé d'utiliser exec(); je ne vois pas comment cela peut être possible.
Une autre manière "plus simple" serait d'utiliser popen();. Ca permet de récupérer la sortie standard du programme exécuté.
Sinon, comme décrit dans le man de popen, ton prof. te demande de réinventer la roue en utilisant un fork(); avec un pipe();.
Utilisation de Glade avec Gtk+
Code::Blocks et Gtk+ sous Windows
Programmation orientée objet avec Gtk+ v3
- N'oubliez pas de consulter les FAQ Gtk et les cours et tutoriels Gtk
si je n'utilise pas le exec comment alors j'exécute le cp?
je sais ce qu'est un tube nommé mais je ne sais pas comment récupérer le message dans un msgBox GTK et comment renvoyer la décision via les boutons de cette fenêtre?
Salut,
tout d'abord je tiens à préciser que je ne connais absolument pas gtk, même si Lazarus s'appuie dessus.
Donc c'est vraiment du bricolage ce que je vais montrer, mais l'idée y est.
Tout d'abord une petite modif dans le script d'appel, pour passer un paramètre au prog gtk dans tous les cas :
ensuite, la modification qui va bien dans prog_gtk.c (qui pour moi est prog_gtk.pas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 if (! (test -e $dest)) then # echo "pas de soucis" ./prog_gtk "pas de soucis"
Comme je ne savais pas comment faire afficher du texte dans ce prog, et que j'avais un exemple avec un Button, j'ai choisi de modifier le texte du Button :
Je vous laisse retranscrire en C et le mettre là où il faut dans vos essais, en tout cas, au final, selon que j'appelle ./script source.txt destination.txt ou ./script source.txt je gagne l'un des deux affichages :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 gtk_init (@argc, @argv) ; window := gtk_window_new (GTK_WINDOW_TOPLEVEL) ; // button := gtk_button_new_with_label ( 'Click_me' ) ; // on peut passer un paramètre au prog : if argc = 1 then button := gtk_button_new_with_label ( 'Pas de paramètre' ) else button := gtk_button_new_with_label ( argv[1] );
Je ne pourrai pas aider plus, encore une fois je ne connais pas gtk.
Bonjour
Que de nœuds au cerveau pour pas grand chose. Si la confirmation de la console te gêne, fais sauter la confirmation de la console. Et fais une confirmation dans ton interface graphique.
Ainsi, l'option "-i" de ta commande cp sera transformée en "-f", ce qui forcera la copie, une fois la confirmation obtenue dans l'interface graphique. Si l'action est annulée, la commande n'est pas exécutée.
Tout d'abord, désolé si je m'incruste ^^
Ensuite. Je pense que son prof voulais qu'ils utilisent l'object TProcess dans l’exercice.
Mais je reste sur mon interrogation qui est : comment utiliser les pipelines pour faire communiquer des programmes: Le titre c'est bien "récupérer affichage shell dans une fenetre GTK" (Sous entendu dans le but de prendre une décision)
@Flodelarab
Si j’enlève l'option -i comment j’obtiens le warning "cp : voulez-vous écraser «destination.txt» ?" (ou en anglais "cp : Do you want to overwrite «destination.txt» ?") ou encore "cp : voulez-vous écraser «destination.txt» en outrepassant le mode 0444 (r--r--r--) ?"
Bref, j'ai l'impression que mon bash :n'est pas la bonne direction...
Code : Sélectionner tout - Visualiser dans une fenêtre à part cp -i source.txt destination.txt | ./my_gtk_confirmation
Quelqu'un sais comment faire se genre de chose ?
2 remarques:
- Je n'ai pas dit d'enlever "-i" mais de le remplacer par "-f". Si ton cp est configuré pour demander par défaut une confirmation, le fait de mettre ou de ne pas mettre -i ne change rien. Il faut explicitement indiquer "-f". Il force la copie sans confirmation.
- La commande cp ne renvoie rien. Donc, mettre un pipe qui va récupérer la sortie de cp, pour le traiter, comme si c'était un fichier texte, sans utiliser de fichier temporaire, ne sert à rien.
Partager