Wie externes Programm oder Prozess starten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
ralli
Beiträge: 4382
Registriert: 02.03.2008 08:03:02

Wie externes Programm oder Prozess starten

Beitrag von ralli » 01.12.2011 06:56:43

Ich habe mich mit für die GUI Programmierung in C mit dem Gimp Toolkit und Gtk und gtk+ eingearbeitet. Am einfachsten war es, Glade zu installieren, weil dann alle erforderlichen Bibliotheken und Werkzeuge gleich mit installiert werden. Glade benutze ich allerdings nicht, sondern erstelle die Software manuell mir Geany. Dann habe ich mir einige gute Tutorials aus dem Netz besorgt und diese auch erfolgreich durchgeabeitet. Auch in devhelp und der API Dokumentaion habe ich gestöbert. Nun zu meinem Problem:

Wie kann ich aus einem Gnome Programm ein externes Programm oder einen synchronen oder asynchronen Prozess aufrufen, das kann ein anderes GUI Programm sein oder eine Befehlsfolge auf der Konsole wie mpg123 Streamadresse
Hier ein Codebeispiel:

Code: Alles auswählen

// Programm : prozess.c

// gcc -o prozess prozess.c `pkg-config --cflags --libs gtk+-2.0`

#include <gtk/gtk.h>

#include <stdlib.h>
 
void button_geklickt(GtkWidget *button_widget, gpointer data) {

// system ("mpg123 http://ndrstream.ic.llnwd.net/stream/ndrstream_ndr1niedersachsen_hi_mp3");
    
system ("gftp");

}
 
int main (int argc, char *argv[]) {
    gtk_init(&argc, &argv);
 
    GtkWidget *window;
    GtkWidget *button;
 
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "Externes Programm aufrufen");
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);
    g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK (gtk_main_quit), NULL);
 
    button = gtk_button_new_with_label("Gftp");

    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(button_geklickt), NULL);
    gtk_widget_show(button);
 
    gtk_container_add(GTK_CONTAINER(window), button);
    gtk_widget_show(window);
 
    gtk_main();
    return 0;
}
Dazu habe ich in der Api nichts gefunden. Das es nach der Includierung von

#include <stdlib.h>

mit System("xxx xxxx") funktioniert, habe ich bereits ausprobiert, aber ist das der richtige Weg?
Geht es besser oder gibt es Alternativen, die mir bis jetzt nicht geläufig und entgangen sind?
Für eine Hilfestellung wäre ich sehr dankbar.
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören. Wer keine Brücken baut, muß spalten.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Wie externes Programm oder Prozess starten

Beitrag von newdeb » 01.12.2011 07:50:59

Allgemein in C mit fork/exec:

Code: Alles auswählen

man 2 fork
man 3 execv
man 2 wait
Ob das auch zusammen mit GTK problemlos funktioniert, weiß ich nicht.

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Wie externes Programm oder Prozess starten

Beitrag von pferdefreund » 01.12.2011 11:58:48

Als Alternative zu system mal popen anschauen - da kann man auch Ergebnisse von Programmen
einsammeln.

Benutzeravatar
ralli
Beiträge: 4382
Registriert: 02.03.2008 08:03:02

Re: Wie externes Programm oder Prozess starten

Beitrag von ralli » 01.12.2011 13:00:19

Danke, ich werde mir das jetzt mal anschauen.
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören. Wer keine Brücken baut, muß spalten.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: Wie externes Programm oder Prozess starten

Beitrag von cosmac » 01.12.2011 18:23:56

hi,
newdeb hat geschrieben:Allgemein in C mit fork/exec:

Code: Alles auswählen

man 2 fork
man 3 execv
man 2 wait
Ob das auch zusammen mit GTK problemlos funktioniert, weiß ich nicht.
Genauso starte ich aus meinem GTK-Programm heraus ein anderes GTK-Programm (Debiangalculator), ein setuid-Programm, iceweasel unter einem anderen User und einen daemon. Soweit funktioniert das anscheinend.

Das einzige, was nicht freiwillig laufen wollte, war close-on-exec. Entweder hatten die Kinder noch meine Dateien geöffnet oder galculator kam in eine Endlosschleife, wenn ich ihm stdin zugemacht habe. Umgekehrt mag es praktisch sein, wenn das Kind das gleiche Logfile mit benutzt. Das muss man tatsächlich von Fall zu Fall richtig machen.

Völlig problemlos funktionieren die Posix message queues (man mq_overview) zusammen mit GTK (eigentlich glib). Mit g_io_add_watch() kann man eine Callback Funktion vereinbaren, die aufgerufen wird, wenn eine neue Message eintrifft.

Wer mehr zu Gnome als zu syscalls tendiert, mag vielleicht g_spawn_ oder sogar GdkAppLaunchContext.
Beware of programmers who carry screwdrivers.

Benutzeravatar
ralli
Beiträge: 4382
Registriert: 02.03.2008 08:03:02

Re: Wie externes Programm oder Prozess starten

Beitrag von ralli » 01.12.2011 19:37:52

Danke auch Dir cosmac für die Anregungen, morgen werde ich mich mit allem beschäftigen und dann später mal berichten.
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören. Wer keine Brücken baut, muß spalten.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie externes Programm oder Prozess starten

Beitrag von GoKi » 01.12.2011 19:52:54

Alternativ bieten sich evtl auch die Funktionen an, die von glib zur Verfügung gestellt werden.
Siehe http://developer.gnome.org/glib/stable/ ... esses.html
MfG GoKi
:wq

Benutzeravatar
ralli
Beiträge: 4382
Registriert: 02.03.2008 08:03:02

Re: Wie externes Programm oder Prozess starten

Beitrag von ralli » 01.12.2011 20:11:46

Klasse, die GLib API habe ich ja auch in meiner lokalen Devhelp. Na, dann habe ich ja die nächsten Tage genug zu tun. Danke Euch allen für die schnelle und kompetente Unterstützung, nun ist learning bei doing Trumpf.
Wer nicht lieben kann, muß hassen. Wer nicht aufbauen kann muß zerstören. Wer keine Brücken baut, muß spalten.

Antworten