Ich suche mir jetzt schon eine Wolf und bin knapp davor aufzugeben. Ich werkel ja immer wieder an meiner "eigenwilligen" eigenen Linuxversion und da immer auch zweigleisig: Eine "normale " mit Desktop (XFCE) und eine reine Textmode Konsolenvariante ohne Desktop und ohne "X". Hier ist jetzt auch mein Problem: Ich würde gerne auf der Textmodekonsole den Zeichensatz ändern und als ewig gestriger möchte ich dort kein UTF-8 verwenden, sondern (wie vor 35 Jahren) einen erweiterten deutschen Ascii-Zeichensatz. Auf der Konsole kann ich "unicode_stop unicode_start setfont fontdatei" eingeben und das funktioniert auch. Damit das ganze auch für den User funktioniert habe ich die 3 Programme nun in das Verzeichnis meines Projektes gelegt, umbenannt und mit User-Rechten versehen. Auch mit umbenannten Namen funktioniert das ganze, wenn ich die Programme von Hand in der Konsole aufrufe. Versuch ich in C nun die Programme zu starten, funktioniert nur ein "system("unicode_start"); system("unicode_stop)" aber ein "errcode= system("setfont Dateiname");" funktioniert nicht, es bringt mir nur den Fehlercode 32512 ! Woran liegt das und gibt es einen - einfachen - Weg, aus einem C-Programm den Zeichensatz zu ändern ?
Ralph S. schrieb: > system("unicode_stop)" aber ein "errcode= system("setfont Dateiname");" > funktioniert nicht, es bringt mir nur den Fehlercode 32512 ! Das funktioniert anscheinend schon, aber es liefert einen Fehler zurück. Vielleicht mal in errno und die Manpage system(3) schauen? > Woran liegt das und gibt es einen - einfachen - Weg, aus einem > C-Programm den Zeichensatz zu ändern ? Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2), das steht in der Manpage und ausformuliert natürlich im Code. Linux ist Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu schauen?
Ralph S. schrieb: > "errcode= system("setfont Dateiname");" > funktioniert nicht, es bringt mir nur den Fehlercode 32512 ! Tipp: Den Returncode vom Aufruf kriegst du per WEXITSTATUS(errcode); in deinem Fall ist das 127 "system()" benutzt "/bin/sh", dort findet sich: Value 127 is returned by /bin/sh when the given command is not found within your PATH system variable and it is not a built-in shell command. Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen.
Ein T. schrieb: > Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2), > das steht in der Manpage und ausformuliert natürlich im Code. Linux ist > Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu > schauen? ... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte ! Εrnst B. schrieb: > Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen. Das habe ich natürlich direkt getan, auch setfont ins aktuelle Verzeichnis kopiert und umbenannt. Das setfont-Programm wird garantiert gefunden !
Ralph S. schrieb: > Ein T. schrieb: >> Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2), >> das steht in der Manpage und ausformuliert natürlich im Code. Linux ist >> Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu >> schauen? > > ... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte Warum? > ! Bitte nicht plenken, damit sowas nicht passiert. > Εrnst B. schrieb: >> Also: PATH-Variable prüfen, oder direkt "/usr/bin/setfont" aufrufen. > > Das habe ich natürlich direkt getan, auch setfont ins aktuelle > Verzeichnis kopiert und umbenannt. Hast du dabei bedacht, dass das aktuelle Verzeichnis normalerweise nicht im PATH ist und daher dort nicht gesucht wird?
Schon mal ausprobiert?
1 | errcode = system("./setfont Dateiname"); |
Macht /bin/sh Probleme? Vielleicht ist setfont ein Alias? Setfont mit exec() statt system() aufrufen.
Rolf M. schrieb: > Bitte nicht plenken, damit sowas nicht passiert. Sorry, passiert mir leider immer wieder einmal! (hier dann ungeplenkt, :-)) Rolf M. schrieb: > Hast du dabei bedacht, dass das aktuelle Verzeichnis normalerweise nicht > im PATH ist und daher dort nicht gesucht wird? Hab ich natürlich bedacht und wie oben geschrieben dass Programm setfont aus /usr/bin in das Projektverzeichnis kopiert, umbenannt und umbenannt aufgerufen. Dasselbe habe ich gemacht mit den Schriftarten, die ich gerne gesetzt haben möchte (aus Verzeichnis /usr/share/kbd/consolefonts) Harald K. schrieb: > errcode = system("./setfont Dateiname"); Hab ich natürlich schon probiert
Xanthippos schrieb: > Setfont mit exec() statt system() aufrufen. na ja, exec kehrt ja nicht zum aufrufenden Programm zurück...
Rolf M. schrieb: > Ralph S. schrieb: >> Ein T. schrieb: >>> Das, was system(3) auch macht, also fork(2), execl(3) und waitpid(2), >>> das steht in der Manpage und ausformuliert natürlich im Code. Linux ist >>> Open Source, die GLibc auch. Was hindert Dich, in die Sourcen zu >>> schauen? >> >> ... das werde ich wohl tun, ist aber genau das, was ich vermeiden wollte > > Warum? In den Code schauen zu müssen ist ein Zeichen dass die Doku versagt hat. Für mich wäre Sourcecode von Systemprogrammen auch nicht die erste Anlaufstelle wenn ich Fragen zur API hätte.
Der 127er Rückgabe-Code muss ja nicht aus der sh kommen, könnte auch sein, dass "setfont" das zurückgibt, wenn der Font nicht gefunden wird. Wobei es bei mir dann einen 66er-Code zurückgibt... # setfont xyz ; echo $? Ansonsten, statt dem gemurkse über system() und co: https://sources.debian.org/src/kbd/2.5.1-1/src/libkfont/ enthält die Funktionen, die setfont verwendet. Ist leider im default statisch gelinkt und wird nicht mitinstalliert? ==> configure mit --enable-libkfont Dann kannst du das dazulinken und direkt kfont_init & kfont_load_fonts aufrufen.
Εrnst B. schrieb: > Ansonsten, statt dem gemurkse über system() und co: > > https://sources.debian.org/src/kbd/2.5.1-1/src/libkfont/ > > enthält die Funktionen, die setfont verwendet. Ist leider im default > statisch gelinkt und wird nicht mitinstalliert? > ==> configure mit --enable-libkfont > > Dann kannst du das dazulinken und direkt kfont_init & kfont_load_fonts > aufrufen. uuuui, das werde ich mal ausprobieren
Ralph S. schrieb: > Xanthippos schrieb: >> Setfont mit exec() statt system() aufrufen. > > na ja, exec kehrt ja nicht zum aufrufenden Programm zurück... Deshalb vorher ein fork(). Le X. schrieb: > In den Code schauen zu müssen ist ein Zeichen dass die Doku versagt hat. Wie in Beitrag "Re: Linux: setfont aus C-Programm aufrufen" schon geschrieben wurde, steht es in der Doku sehr wohl auch drin. Da ist sogar der genaue Aufruf von execl() enthalten. Dass man zusätzlich auch noch in den Quellcode schauen kann, ist ein Vorteil, kein Nachteil.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.