[gtk] Fensterprogramm mit popen öffnen führt zu kritischen Fehlern



  • Hallo c-community,

    ich versuche gerade ein Fensterprogramm (ist ganz simpel nur 2 Buttons und 2 Images), welches mir je nach Aktion eine einfache Ausgabe in stdout übergibt, mit einem popen-Befehl auszuführen. Ziel ist es die einfachen Ausgaben ins stdout abzufangen und darauf zu reagieren.

    Das Fensterprogramm funktioniert einwandfrei (getestet mit valgrind speicherleckfrei) und lässt sich ausführen. Je nach Aktion sehe ich im Terminal meine Ausgaben.

    Jetzt möchte ich mit folgendem Programm das gtk-Fenster aufrufen:

    int main(void){
        FILE    *_pipe;
        char    *_command    =   (char*)"Fenster/./Fenster";
        char    _line[256];
    
        if(!(_pipe = (FILE*)popen(_command, "r"))){
            perror("Error:\tfailed to open pipe to window\n");
            return 0;
        }
    
        while (fgets(_line, 256, _pipe)){
            printf("%s\n", _line);
        }
    
        pclose(_pipe);
    
        return 1;
    

    Wie gesagt, ich möchte die Ausgabe ins stdout abfangen, um heraus zu finden, welcher Button gedrückt wurde.
    Leider erhalte ich nur folgende Ausgabe:

    (Fenster:6919): Gtk-CRITICAL **: gtk_window_set_position: assertion `GTK_IS_WINDOW (window)' failed

    (Fenster:6919): GLib-GObject-WARNING **: invalid (NULL) pointer instance

    (Fenster:6919): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

    (Fenster:6919): Gtk-CRITICAL **: gtk_image_set_from_file: assertion `GTK_IS_IMAGE (image)' failed

    (Fenster:6919): Gtk-CRITICAL **: gtk_image_set_from_file: assertion `GTK_IS_IMAGE (image)' failed

    (Fenster:6919): GLib-GObject-WARNING **: invalid (NULL) pointer instance

    (Fenster:6919): GLib-GObject-CRITICAL **: g_signal_connect_data: assertion `G_TYPE_CHECK_INSTANCE (instance)' failed

    (Login:6919): Gtk-CRITICAL **: gtk_widget_show_all: assertion `GTK_IS_WIDGET (widget)' failed

    Liegt das Problem daran, dass ich mich nicht mehr im Fensterordner befinde?

    Datenstruktur: im Ordner des aufrufenden Programmes liegen seine .c-, .h und .o-Dateien. Ebenso liegt hier der Ordner mit dem Fensterprogramm (Unterordner). Das Fensterprogramm hat einen Unterordner für .c- und .h-Dateien, einen Ordner für .o-Dateien und einen seperaten Ordner für die 2 Images.

    Hoffe jemand kennt dieses Problem und kann mir einen Hinweis geben.

    MfG
    mirrowwinger



  • char    *_command    =   (char*)"Fenster/./Fenster";
    

    Du weißt aber schon, dass popen nach einem Nullterminierten String verlangt?



  • Toaster schrieb:

    char    *_command    =   (char*)"Fenster/./Fenster";
    

    Du weißt aber schon, dass popen nach einem Nullterminierten String verlangt?

    Du weißt aber das ein Stringliteral im code automatisch null terminiert ist?

    @mirrowwinger: Sind das alle Fehlermeldungen?

    Wenn du das ganze unter linux laufen lässt dann hänge an das commando folgendes an:

    2>&1

    ->

    char    *_command    =   (char*)"Fenster/./Fenster 2>&1";
    

    Dadurch wird auch stderr zu stdout umgeleitet. Dadurch sollte in der pipe (von popen zurückgeliefert) auch fehlermeldungen, welche das programm nach stderr ausgibt mit auftauchen.

    Mögliches Problem wenn das ganze unter Linux läuft:
    Es kann gut sein, dass GTK keine Verbindung zum X-Server bekommt, wenn es per popen gestartet wird, da entsprechende ENV variablen nicht gesetzt sind (z.b. DISPLAY)



  • @firefly: Jupp sind alle Fehlermeldungen. Das Programm friert quasi an dem Punkt ein und ich muss es mit [ctrl]+[c] killen, damit ich weiter machen kann. Das Fenster bekomme ich leider nicht zu sehen.

    Gibt es eine andere Lösung abseits von popen, um mein Problem zu lösen? (Fork, Exec,...) Ziel bleibt, das Fensterprogramm auszuführen und auf die 2 Buttons zu reagieren.

    mirrowwinger


Log in to reply