Linux + GTK + C läuft nur in Verbindung mit Konsole :-(



  • Hallo,

    ich habe ein Programm das ursprüglich für die Konsole unter Linux entwickelt worden ist. Zeitgemäß sollte mit einer GUI versehen werden, hier kam GTK gerade richtig. Läuft auch super nur jetzt wenn ich das ohne Konsole Starte, also mit klick im Konqeuror öffnet sich zwar das Programm, lässt sich auch beenden. Nur bei dem klicken auf den eigentlichen funktionsknopf (hat u.a. Zugriff auf stdlib.h usw.) passiert garnichts.

    Erstemal folgendes ist eingebunden:

    #include <config.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>    
    #include <sys/types.h>
    
    //In der config.h steht:
    
    /* config.h.  Generated from config.h.in by configure.  */
    /* config.h.in.  Generated from configure.in by autoheader.  */
    
    /* Define to 1 if you have the <dlfcn.h> header file. */
    #define HAVE_DLFCN_H 1
    
    /* Define to 1 if you have the <inttypes.h> header file. */
    #define HAVE_INTTYPES_H 1
    
    /* Define to 1 if you have the <memory.h> header file. */
    #define HAVE_MEMORY_H 1
    
    /* Define to 1 if you have the <stdint.h> header file. */
    #define HAVE_STDINT_H 1
    
    /* Define to 1 if you have the <stdlib.h> header file. */
    #define HAVE_STDLIB_H 1
    
    /* Define to 1 if you have the <strings.h> header file. */
    #define HAVE_STRINGS_H 1
    
    /* Define to 1 if you have the <string.h> header file. */
    #define HAVE_STRING_H 1
    
    /* Define to 1 if you have the <sys/stat.h> header file. */
    #define HAVE_SYS_STAT_H 1
    
    /* Define to 1 if you have the <sys/types.h> header file. */
    #define HAVE_SYS_TYPES_H 1
    
    /* Define to 1 if you have the <unistd.h> header file. */
    #define HAVE_UNISTD_H 1
    
    /* Name of package */
    #define PACKAGE "konsole"
    
    /* Define to the address where bug reports for this package should be sent. */
    #define PACKAGE_BUGREPORT ""
    
    /* Define to the full name of this package. */
    #define PACKAGE_NAME ""
    
    /* Define to the full name and version of this package. */
    #define PACKAGE_STRING ""
    
    /* Define to the one symbol short name of this package. */
    #define PACKAGE_TARNAME ""
    
    /* Define to the version of this package. */
    #define PACKAGE_VERSION ""
    
    /* Define to 1 if you have the ANSI C header files. */
    #define STDC_HEADERS 1
    
    /* Version number of package */
    #define VERSION "0.8"
    

    Bei Klick auf den func button passier wie gesagt nichts man kann ichn sofoft klicken wie man will. Normalerweise solte eine callbackfunktion aufgerufen werden die eine Datei Zeichenweise lesen soll

    while((zeichen=getc(device)) != EOF)
    		{
    			multiscan(zeichen);
    // 			g_print("Aktuelles Zeichen %d\n",zeichen);
    		}
    

    Sämtliche Ausgaben ob g_print oder ähnliches habe ich schon deaktiviert.

    Mit gcc compiliert (optionen):
    -O3 -g0 -s `pkg-config --cflags gtk+-2.0` \
    `pkg-config --libs gtk+-2.0`

    Vielleicht kann mir einer helfen wäre SUPER!



  • hab aus versehen als unregistrierter user gepostet...



  • Etwas mehr Code wäre hilfreich.



  • GPC schrieb:

    Etwas mehr Code wäre hilfreich.

    Das ein bisschen viel...hier der Teil der die GUI lädt:

    #include <einstellungen.h> /* unwichtig hier aufgeführte ifdef's & oben genannte libs */
    
    //GTK Entry Textinhalt
    GtkWidget *entry_device;
    GtkWidget *entry_destination;
    
    //Fenster
    GtkWidget *fenster;
    GtkWidget *button_recover, *button_quit;
    
    //PR-------------------------------------------------------------------------------------------------------_
    #include <progressbar.h> /* LEER */
    
    gint delete_cb(GtkWidget *widget, GdkEvent *event, gpointer *data)
    {
    return(TRUE);
    }
    void ende_cb(GtkObject *object)
    {
    	gtk_main_quit();
    
    	#ifdef DEBUG_GUI_OUT
    	g_print("\nSchließe Anwendung\n\n");
    	#endif	
    	exit(0);
    }
    
    void get_device_string( GtkWidget *widget/*, GtkWidget *entry*/ )
    {
    
    	const gchar *entry_text_device;
    
    	entry_text_device = gtk_entry_get_text (GTK_ENTRY (entry_device));
    
    	#ifdef DEBUG_GUI_OUT
    	g_print("Entry contents: %s\n", entry_text_device);
    	#endif
    	//ergebnis sichern...
    	const gchar *entry_text_destination;
    	entry_text_destination = gtk_entry_get_text (GTK_ENTRY (entry_destination));
    
    	#ifdef DEBUG_GUI_OUT
    	g_print("Entry contents: %s\n", entry_text_destination);
    	#endif
    
    	// Stümper EXEC
    	device = fopen(entry_text_device, "r");
    	if(device==NULL || entry_text_device==NULL || entry_text_destination==NULL || opendir(entry_text_destination)==0) 
    	{ 
    	#ifdef DEBUG_GUI_OUT
    		g_print("Probleme mit argumenten\n");
    	#endif
    	} else
    	{
    
    	#ifdef DEBUG_GUI_OUT
    		g_print("OK");
    	#endif
    		strcpy(writepath, entry_text_destination);
    	#ifdef DEBUG_GUI_OUT
    		g_print("writepath: %s\n",writepath);
    	#endif
    
    	/* MARK 0 */
    
    	int zeichen;
    		while((zeichen=getc(device)) != EOF)
    		{
    			multiscan(zeichen);
    // 			system("firefox"); /* MARK X */
    
    // 			g_print("Aktuelles Zeichen %d\n",zeichen);
    		}
    	}
    
    	/* MARK 1 */
    
    }
    
    int load_gui( int   argc,
              char *argv[] )
    {
    	GtkWidget *box;
    // 	GtkWidget *hbox;
    // 	GtkWidget *vbox;
    
    	GtkWidget *label;
    
    	gtk_init(&argc, &argv);
    
    	fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
    	/*Eingabefläche*/
     	entry_device = gtk_entry_new ();
     	gtk_entry_set_max_length (GTK_ENTRY (entry_device), TARGET_PATH_SIZE);
     	gtk_entry_set_text (GTK_ENTRY (entry_device), "Quellgerät / Datei");
    
    	entry_destination = gtk_entry_new ();
     	gtk_entry_set_max_length (GTK_ENTRY (entry_destination), TARGET_PATH_SIZE);
     	gtk_entry_set_text (GTK_ENTRY (entry_destination), "Zielpfad");
    
    	/*Buttons erstellen*/
    	button_recover= gtk_button_new_with_label("Einlesen");
    	button_quit= gtk_button_new_with_label("Beenden");
    
    	/*TEXTEN*/
    	box = gtk_frame_new ("Normal Label");
      	label = gtk_label_new ("Konsole");
    
    	/*Neue Box erstellen*/
    	box = gtk_vbox_new(FALSE,0);
    
    	/*Signale registrieren*/
    	/* Schließen */ 	gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked", GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
    
    	/* Schließen über X */ 	gtk_signal_connect_object(GTK_OBJECT(fenster), "destroy", GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
    
    	/* Wiederherstellen */ 	gtk_signal_connect_object(GTK_OBJECT(button_recover), 
    									"clicked", GTK_SIGNAL_FUNC(get_device_string), 
    											GTK_OBJECT(fenster));
    	/* Durchsuchen */
    
    	/*Fenstertitel*/
    	gtk_window_set_title(GTK_WINDOW(fenster), "Konsole");
    	gtk_window_set_default_size(GTK_WINDOW(fenster), 300, 100);	
    
    	/*Fensterposition*/
    	gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);
    	gtk_container_set_border_width(GTK_CONTAINER(fenster),25);
    
    	/*Nun alles rein in die Box....*/
    	gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(box), entry_device, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(box), entry_destination, FALSE, FALSE, 20);
    
    	gtk_box_pack_start(GTK_BOX(box), button_recover, FALSE, FALSE, 0);
    	gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 0);
    
    	//--------------------------------------------------------------------
    
    	gtk_container_add(GTK_CONTAINER(fenster),box);
    
    	gtk_widget_show_all(fenster);
    
    	gtk_main();
    	return 0;
    
    	exit(0);
    }
    

    Anmerkung:
    - device ist ein globaler dateizeiger.
    - Es wird in allen Daten die oben genannten header eingebunden, mithilfe von einstellungen.h

    Aufgerufen wird load_gui() über die main() nach ein paar Bedingungen.

    😞 callback get_device_string() ist der Übeltäter. die Whileshleife will einfach nicht.

    Alles Läuft, nur das ohne Konsole eben nicht.

    system("firefox") Befehl läuft in der Funktion get_device_string() nur bei /*MARK 0*/ + /*MARK 1*/

    jedoch nicht bei /*MARK X*/

    DANKE!



  • Hallo,

    ich bin nicht sicher, was dein Code machen soll. Er ist ziemlich wirr. Ich habe ihn mal kurz so "umgeschrieben" (keine Panik, nur einige winzige Änderungen), dass er eine Datei einliest und kopiert. Zur Vereinfachnung habe ich eine große Datei draus gemacht. Funktioniert sowohl aus der Konsole als aus dem Konqueror heraus hervorragend:

    #include <gtk/gtk.h>
    
    //#include <config.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    #include <unistd.h>    
    #include <sys/types.h>
    
    //#define DEBUG_GUI_OUT
    
    //In der config.h steht:
    
    /* config.h.  Generated from config.h.in by configure.  */
    /* config.h.in.  Generated from configure.in by autoheader.  */
    
    /* Define to 1 if you have the <dlfcn.h> header file. */
    #define HAVE_DLFCN_H 1
    
    /* Define to 1 if you have the <inttypes.h> header file. */
    #define HAVE_INTTYPES_H 1
    
    /* Define to 1 if you have the <memory.h> header file. */
    #define HAVE_MEMORY_H 1
    
    /* Define to 1 if you have the <stdint.h> header file. */
    #define HAVE_STDINT_H 1
    
    /* Define to 1 if you have the <stdlib.h> header file. */
    #define HAVE_STDLIB_H 1
    
    /* Define to 1 if you have the <strings.h> header file. */
    #define HAVE_STRINGS_H 1
    
    /* Define to 1 if you have the <string.h> header file. */
    #define HAVE_STRING_H 1
    
    /* Define to 1 if you have the <sys/stat.h> header file. */
    #define HAVE_SYS_STAT_H 1
    
    /* Define to 1 if you have the <sys/types.h> header file. */
    #define HAVE_SYS_TYPES_H 1
    
    /* Define to 1 if you have the <unistd.h> header file. */
    #define HAVE_UNISTD_H 1
    
    /* Name of package */
    #define PACKAGE "konsole"
    
    /* Define to the address where bug reports for this package should be sent. */
    #define PACKAGE_BUGREPORT ""
    
    /* Define to the full name of this package. */
    #define PACKAGE_NAME ""
    
    /* Define to the full name and version of this package. */
    #define PACKAGE_STRING ""
    
    /* Define to the one symbol short name of this package. */
    #define PACKAGE_TARNAME ""
    
    /* Define to the version of this package. */
    #define PACKAGE_VERSION ""
    
    /* Define to 1 if you have the ANSI C header files. */
    #define STDC_HEADERS 1
    
    /* Version number of package */
    #define VERSION "0.8"
    //#include <einstellungen.h> /* unwichtig hier aufgeführte ifdef's & oben genannte libs */
    
    //GTK Entry Textinhalt
    GtkWidget *entry_device;
    GtkWidget *entry_destination;
    
    //Fenster
    GtkWidget *fenster;
    GtkWidget *button_recover, *button_quit;
    
    //PR-------------------------------------------------------------------------------------------------------_
    //#include <progressbar.h> /* LEER */
    
    gint delete_cb(GtkWidget *widget, GdkEvent *event, gpointer *data)
    {
    return(TRUE);
    }
    void ende_cb(GtkObject *object)
    {
    gtk_main_quit();
    
    #ifdef DEBUG_GUI_OUT
    g_print("\nSchließe Anwendung\n\n");
    #endif   
    exit(0);
    }
    
    void get_device_string( GtkWidget *widget/*, GtkWidget *entry*/ )
    {
    
    const gchar *entry_text_device;
    	char writepath[100];
    entry_text_device = gtk_entry_get_text (GTK_ENTRY (entry_device));
    
    #ifdef DEBUG_GUI_OUT
    g_print("Entry contents: %s\n", entry_text_device);
    #endif
    //ergebnis sichern...
    const gchar *entry_text_destination;
    entry_text_destination = gtk_entry_get_text (GTK_ENTRY (entry_destination));
    
    #ifdef DEBUG_GUI_OUT
    g_print("Entry contents: %s\n", entry_text_destination);
    #endif
    
    // Stümper EXEC
    FILE *device = fopen(entry_text_device, "r");
    FILE *out = NULL;
    if(device==NULL || entry_text_device==NULL || entry_text_destination==NULL /*|| opendir(entry_text_destination)==0*/)
    {
    #ifdef DEBUG_GUI_OUT
    	g_print("Probleme mit argumenten\n");
    #endif
    } else
    {
    
    #ifdef DEBUG_GUI_OUT
    	g_print("OK");
    #endif
    	strcpy(writepath, entry_text_destination);
    #ifdef DEBUG_GUI_OUT
    	g_print("writepath: %s\n",writepath);
    #endif
    /* MARK 0 */
    
    	out = fopen(writepath, "w");
    	if (!out) {
    		exit(1);
    	}
    int zeichen;
    	while((zeichen=getc(device)) != EOF)
    	{
    	putc(zeichen, out);
    
    	//multiscan(zeichen);
    //             system("firefox"); /* MARK X */
    
    //             g_print("Aktuelles Zeichen %d\n",zeichen);
    	}
    
    }
    fclose(device);
    fclose(out);
    
    /* MARK 1 */
    
    }
    
    int load_gui( int   argc,
    	char *argv[] )
    {
    GtkWidget *box;
    //     GtkWidget *hbox;
    //     GtkWidget *vbox;
    
    GtkWidget *label;
    
    gtk_init(&argc, &argv);
    
    fenster = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    
    /*Eingabefläche*/
    entry_device = gtk_entry_new ();
    //gtk_entry_set_max_length (GTK_ENTRY (entry_device), TARGET_PATH_SIZE);
    gtk_entry_set_text (GTK_ENTRY (entry_device), "Quellgeraet / Datei");
    
    entry_destination = gtk_entry_new ();
    //gtk_entry_set_max_length (GTK_ENTRY (entry_destination), TARGET_PATH_SIZE);
    gtk_entry_set_text (GTK_ENTRY (entry_destination), "Zielpfad");
    
    /*Buttons erstellen*/
    button_recover= gtk_button_new_with_label("Einlesen");
    button_quit= gtk_button_new_with_label("Beenden");
    
    /*TEXTEN*/
    box = gtk_frame_new ("Normal Label");
    label = gtk_label_new ("Konsole");
    
    /*Neue Box erstellen*/
    box = gtk_vbox_new(FALSE,0);
    
    /*Signale registrieren*/
    /* Schließen */     gtk_signal_connect_object(GTK_OBJECT(button_quit), "clicked", GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
    
    /* Schließen über X */     gtk_signal_connect_object(GTK_OBJECT(fenster), "destroy", GTK_SIGNAL_FUNC(ende_cb), GTK_OBJECT(fenster));
    
    /* Wiederherstellen */     gtk_signal_connect_object(GTK_OBJECT(button_recover),
    				"clicked", GTK_SIGNAL_FUNC(get_device_string),
    					GTK_OBJECT(fenster));
    /* Durchsuchen */
    
    /*Fenstertitel*/
    gtk_window_set_title(GTK_WINDOW(fenster), "Konsole");
    gtk_window_set_default_size(GTK_WINDOW(fenster), 300, 100);   
    
    /*Fensterposition*/
    gtk_window_set_position(GTK_WINDOW(fenster),GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(fenster),25);
    
    /*Nun alles rein in die Box....*/
    gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(box), entry_device, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(box), entry_destination, FALSE, FALSE, 20);
    
    gtk_box_pack_start(GTK_BOX(box), button_recover, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(box), button_quit, FALSE, FALSE, 0);
    
    //--------------------------------------------------------------------
    
    gtk_container_add(GTK_CONTAINER(fenster),box);
    
    gtk_widget_show_all(fenster);
    
    gtk_main();
    return 0;
    
    exit(0);
    }
    
    int main(int argc, char **argv) {
    	return load_gui(argc, argv);
    }
    

    Deine Formatierung solltest du noch mal überdenken.

    MfG

    GPC



  • Vielen Dank für die Antwort, werde mir das mal in Ruhe ansehen.

    Danke!



  • hallo, habe das ganze mal schnell compiliert, ergebnis wie vorher.
    wenn ich das programm ohne konsole ausführe beendet es sich. mit funkioniert es. vielleicht liegt es an meinem System?

    Meins>

    Software:
    SuSE Linux 10.2 (SMP)
    KDE 3.5 / Konqueror 3.5
    alle Programmbibliotheken installiert, u.a. gtk 2, gcc
    das ganze wird mit kdevelop(gcc) compliert.

    gcc -v: gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)
    gtk-config --version: 1.2.10

    Hardware:
    IBM Netfinity 5500 M20
    4x P3 XEON a 500 Mhz (1 MB Cache)
    1152 MB REG/ECC SD-RAM
    ServeRaid SCSI
    Matrox 8 MB PCI
    SB Audigy Player
    (kein witz, das ding steht mit verlängerungskabeln in anderem zimmer...)

    wäre nett wenn du mir ein paar deiner daten nennen könntest, auch mit welchen optionen du compiliert hast.

    Danke!



  • cens schrieb:

    hallo, habe das ganze mal schnell compiliert, ergebnis wie vorher.
    wenn ich das programm ohne konsole ausführe beendet es sich.

    Versteh' ich nicht. Wenn ich das Teil starte und in die Textfelder zwei vernünftige Eingabewerte eintrage (z.B. /home/gpc/tmp/foo.txt und /home/gpc/tmp/bar.txt ), dann auf Einlesen klicke tut der das auch. Da beendet sich nix. Beschreib mal, was du da genau tust.

    wäre nett wenn du mir ein paar deiner daten nennen könntest, auch mit welchen optionen du compiliert hast.

    System:

    [gpc@desktop ~]$ uname -a; gtk-config --version
    FreeBSD desktop 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 11:05:30 UTC 2007     root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP  i386
    
    1.2.10
    

    Meine gtk+ und Konsorten Versionen:

    gtk-2.10.9 
    glib-2.12.9 
    atk-1.12.4 
    pango-1.14.10 
    cairo-1.2.6_1
    

    Kompiliert mit:

    gcc -o main main.c $(pkg-config gtk+-2.0 --cflags --libs)
    

    MfG

    GPC



  • Versteh' ich nicht. Wenn ich das Teil starte und in die Textfelder zwei vernünftige Eingabewerte eintrage (z.B. /home/gpc/tmp/foo.txt und /home/gpc/tmp/bar.txt ), dann auf Einlesen klicke tut der das auch. Da beendet sich nix. Beschreib mal, was du da genau tust.

    - also ich starte das prog (entweder über ./testprog in der Konsole oder im konqueror durch klick auf die Programmdatei)
    - programm startet
    - ich gebe den dateiname an (in dem fall relativ,& absolut im nächsten test)
    - dann das ziel im nächsten feld (in dem fall relativ,& absolut im nächsten test)
    - klicke auf 'einlesen' dann:
    if('mit Konsole') < Datei wird kopiert, Programm beendet sich nicht>
    else if('Konqueror klick') <Fenster schließt sich, es wird nichts kopiert, Befehl: killall testprog > sagt: kein Prozess gefunden, also Programm beendet.>

    Danke! :p



  • Hab jetzt nochmal genau mit deinen gcc optionen (gcc -o main main.c $(pkg-config gtk+-2.0 --cflags --libs)) kompiliert, leider das gleiche ergebnis. 😞



  • cens schrieb:

    if('mit Konsole') < Datei wird kopiert, Programm beendet sich nicht>
    else if('Konqueror klick') <Fenster schließt sich, es wird nichts kopiert,

    Äh, welches if entscheidet über Konsole oder nicht Konsole? Wir sprechen noch über den Quelltext, den ich postete?



  • Hallo,

    vielleicht nicht ganz verständlich, wenn ich das programm von dir mit der Konsole ausführe, funktioniert es wie beschrieben.
    Wenn das programm im konqueror ausgeführt wird beendet es sich nach dem klicken auf einlesen (selbstverständlich mit richtigen pfaden).

    Danke!



  • Tut mir leid, ich kann das Verhalten hier nich reproduzieren. Welche Versionen von gtk+ hast du installiert?



  • Also ich habe:

    gtk+ : 2.10.6-13 / von Mo 27 Nov 2006 22:02:08 CET
    gtk2-engines: 2.8.1-16 / von Mo 27 Nov 2006 22:32:39 CET

    Danke!



  • Tjo. Alles was ich sagen kann ist: Bring dein gtk+ und Konsorten auf den aktuellsten Stand. Sorry, aber da hier das Problem nicht auftritt, kann ich nicht mehr dazu sagen. Ich müsste es an deiner Mühle sehen, aber das wird schwierig 😉



  • Hallo, werd das ganze jetzt mal updaten und mich dann melden. Hatte mir mal die aktuelle debian version 3.1r5 für sparc runtergeladen und gewundert wieso die installation nicht klappt, habe mir die finger wund installiert, bis ich mal widerwillen in der Bugliste nachgelesen habe - und tatsächlich seit 3.1r1a haben die debianleute die sparc installerkomponenten einfach vergessen 😡
    ➡ ➡ ➡ bisschen vom Thema abgewichen...

    habe noch fragen 3, die schon seit bestimmt ein 1 Jahr beschäftigen && quälen :

    1😕. Gibt es bei Gtk+ eine Window-Updatefunktion, mit der man wie bei ncurses (wrefresh()) den Fensterinhalt aktualisieren kann. bisher hatte ich immer das problem das ich auf das fenster warten musste bis der leseprozess fertig war, und bei 80 GB Festplatten kann das eine weile...in zukunft soll man nämlich den leseprozess auch abbrechen können.

    2😕. (habe schon gesucht wie bekloppter!) gibt es in C (bestimmt nicht) oder bei Linux systemfunktionen mit denen man im handumdrehen die größe von festplatten (oder anderen Blockgeräten) ausgeben kann?, df kann das doch auch. klar man könnte ja auch mit getc zeichenweise hochzählen aber das dauert leider.

    3😕. ein riesiges andere problem welches ich habe ist die zeigerpositionierung mit lseek (oder so). Angeblich soll das ja in C funktionieren. es funktioniert leider bei mir nicht, in einem Kernel-Programmiererbuch (version 1.2 ⚠ ) von mir steht das diese funktion bei linux mit blockgeräten leider nicht funktioniert. nur leider liest mein programm fast auschließlich von blockgeräten wie z.B. /dev/sda usw.
    Die netten VFS-treiber machen das ja auch irgenwie?

    Danke für die ganze Mühe!



  • cens schrieb:

    1😕. Gibt es bei Gtk+ eine Window-Updatefunktion, mit der man wie bei ncurses (wrefresh()) den Fensterinhalt aktualisieren kann. bisher hatte ich immer das problem das ich auf das fenster warten musste bis der leseprozess fertig war, und bei 80 GB Festplatten kann das eine weile...in zukunft soll man nämlich den leseprozess auch abbrechen können.

    Das refreshen kannst du dir sparen. Implementiere deine Aktion einfach als Thread (Glib::Thread bietet sich an) und lass sie laufen. Über einen Signal-Handler kannst du dann z.B. den Fortschritt an das GtkWindow senden.

    2😕. (habe schon gesucht wie bekloppter!) gibt es in C (bestimmt nicht) oder bei Linux systemfunktionen mit denen man im handumdrehen die größe von festplatten (oder anderen Blockgeräten) ausgeben kann?, df kann das doch auch. klar man könnte ja auch mit getc zeichenweise hochzählen aber das dauert leider.

    http://www.linuxforums.org/forum/linux-kernel/69520-how-get-hard-disk-info-using-c-program.html

    3😕. ein riesiges andere problem welches ich habe ist die zeigerpositionierung mit lseek (oder so). Angeblich soll das ja in C funktionieren. es funktioniert leider bei mir nicht, in einem Kernel-Programmiererbuch (version 1.2 ⚠ ) von mir steht das diese funktion bei linux mit blockgeräten leider nicht funktioniert. nur leider liest mein programm fast auschließlich von blockgeräten wie z.B. /dev/sda usw.
    Die netten VFS-treiber machen das ja auch irgenwie?

    Das frägst du am Besten im Unix/Linux Subboard weiter unten nochmal, da bin ich überfragt... hab ja auch kein GNU/Linux.

    MfG

    GPC



  • danke, danke, danke!



  • Hallo, ich habe mal noch eine Frage wollte das ganze mal SuSE 9.2 testen, jedoch ohne erfolg, obwohl ich statisch kompiliert habe:

    Optionen:
    -O2 -g0 -s `pkg-config --cflags gtk+-2.0` \ `pkg-config --libs gtk+-2.0`

    trotzdem -s wird nicht statisch kompiliert.

    die Fehlermeldung:
    ./testfunktionen: error while loading shared libraries: libpangocairo-1.0.so

    wie kann man dem pkg-config denn sagen das alles statisch reingepackt werden soll. sehr wichtig ist mir das das ganze möglichst kompatibel zu allen Linux-X'en ist.

    Vielen Dank schon mal!



  • cens schrieb:

    trotzdem -s wird nicht statisch kompiliert.

    Das ist auch okay so.

    -s macht das gleiche, wie wenn du nach dem Kompilieren und Linken noch strip auf das Binary anwenden würdest ➡ Es entfernt die Symbole.

    -s: Remove all symbol table and relocation information from the executable.
    

    Was du suchst, ist -static:

    -static:  On systems that support dynamic linking, this prevents linking with the shared libraries.  On other systems, this option has no effect.
    

    Allerdings muss dafür auch gtk+ usw. statisch gebaut worden sein. Wenn du es dynamisch gebaut hast, kannst du lange -static angeben. Das wird nix.

    Es ist normal, dass man solche Libs dynamisch linkt. Mach dir da keinen Kopf. Die binary würde eh richtig richtig fett werden, wenn du alles statisch reinkompilieren würdest.

    MfG

    GPC


Anmelden zum Antworten