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;
Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peut–être qu'il peut être sûr, etc.
Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
Mes 2 cts,
--
jp
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?
Au vu de ta réponse il semblerait donc possible d'utiliser d'autres fonctions que exec(); ? Si c'est oui popen(); te permet d'exécuter une commande et de récupérer dans un descripteur de fichier la sortie standard de la dite commande. En voila un exemple http://www.infres.enst.fr/~dax/polys/tp-c-shell/#popen
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
est ce que je peux écrire la commande comme ceci:
et où est ce que je met le path et la destinantion de la copie?
Code : Sélectionner tout - Visualiser dans une fenêtre à part File * popen("cp -i","w");
et comment récupérer par gtk le message et renvoyer la décision de l'utilisateur?
tout ça me parait un peux vague, pourriez vous m'expliquer, SVP?
Malheureusement tu ne peux pas écrire et lire en même temps avec cette fonction. Lorsque tu l'exécutes, le deuxième argument te permet d'indiquer que tu ouvres un tunnel soit en lecture, soit en écriture.
En reprenant le code exemple du lien que je t'ai donné tu devrais déjà pouvoir commencer à avoir un début de solution :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 FILE *pp; if ((pp = popen("ps aux", "r") == NULL) { perror("popen"); exit(1); } while (fgets(buf, sizeof(buf), pp)) fputs(buf, stdout); pclose(pp);
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
Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peut–être qu'il peut être sûr, etc.
Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
Mes 2 cts,
--
jp
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,
Je voulais faire le même exercice que Hind4Dev mais sans l'énoncé (Purement une histoire de droit d’auteur)
J'ai fait un script bash que j'utilise comme ca : ./script source.txt destination.txt
Et un GtkDialog qui devrais reprendre et afficher la sortie de la commande cp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #!/bin/bash src=$1 dest=$2 if (! (test -e $dest)) then echo "pas de soucis" else # TODO check DISPLAY cp $src -i $dest | ./my_gtk_prompt fi
Dois-je utiliser GStreamer ? Ce tutoriel me permettrais t-il d'y parvenir ?
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 // file main.c // compile: gcc main.c -o my_gtk_prompt `pkg-config --cflags --libs gtk+-2.0` #include <gtk/gtk.h> //#include <gst/gst.h> int main( int argc, char *argv[] ) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_widget_show (window); g_signal_connect (window, "delete-event", G_CALLBACK (gtk_main_quit), NULL); gtk_window_set_title(GTK_WINDOW(window), argv[0]);// argv[1] == (null) gtk_main (); g_print("yes"); // or no g_print("\n"); return 0; }
Une autre question. Comment géré les erreur de permissions dans le GtkDialog ?
Merci
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.
Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peut–être qu'il peut être sûr, etc.
Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
Mes 2 cts,
--
jp
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.
Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager