Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Programm aus Gtk+ heraus starten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
27.04.2005, 21:17 Uhr
BeS



Hi,
ich schreibe gerade ein kleines panel-applet mit Gtk+.
Ich will jetzt mit dem click auf einen button ein consolen-Programm starten. Dieses beendet sich im Idealfall nie, wenn doch, dann würde ich es gerne im Programm bemerken.
Ansonsten will ich mit einem weiteren Click auf den Button das Programm wieder beenden (bzw. zum beenden zwingen).

Wie mache ich das am besten?
Geht das mit C Bordmitteln oder gibt es dazu spezielle Gtk+ Befehle?

Danke!
--
If art interprets our dreams, the computer execute them in the guise of programs!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.04.2005, 21:43 Uhr
0xdeadbeef
Gott
(Operator)


Erst forken, dann per system das Programm aufrufen. Wenn auf den Button geklickt wird, ein SIGTERM an den Kindprozess schicken. Wenn der Kindprozess terminiert, kriegste ein SIGCHLD an den Vaterprozess, das musste halt abfangen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 27.04.2005 um 21:46 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.04.2005, 21:51 Uhr
BeS



Kannst du das etwas genauer beschreiben? Ich habe schon etwas ähnliches versucht:


Code:
   connected = !connected;
    if (connected) {
        child_pid = fork();
        if (child_pid > 0)
            execlp("/usr/bin/emacs", "/usr/bin/emacs", "/tmp/test.txt", NULL);

        gtk_image_set_from_stock ((GtkImage*)data,
                                  GTK_STOCK_CONNECT,GTK_ICON_SIZE_MENU);
    } else {
        if (child_pid > 0)
            kill(child_pid, 9);

        gtk_image_set_from_stock ((GtkImage*)data,
                                  GTK_STOCK_DISCONNECT,GTK_ICON_SIZE_MENU);
    }



Damit wurde zwar der Prozess gestartet und damit auch emacs, aber das kill hatte nicht den gewüschten Effekt.

Wie fange ich ein SIGCHLD ab?

Danke!

EDIT: Dummer Fehler... es muß da oben natürlich if(child_pid == 0) heißen.
Dann geht es mit excelp(), mit system() komischer Weise nicht. Ist ja aber eigentlich auch egal.
Jetzt bleibt nur noch die Frage wie ich SIGCHLD von dem mit execlp gestarteten Programm abfangen kann.
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 27.04.2005 um 22:12 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2005, 22:15 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


musst mit sighandler(!?) ein signalhandler einstellen, mike hatte mal ein beispiel in einem der foren
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.04.2005, 23:23 Uhr
BeS



Ich habe es zwar nicht im Forum gefunden, aber mit google, geht ganz einfach:

Handler setzen

Code:
signal(SIGCHLD, vpnclient_died);


und dann die Funktion:

Code:
void vpnclient_died(int signum)
{
    ...
}


--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 27.04.2005 um 23:24 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: