Umgebungsvariablen lesen unter C [Erledigt]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Umgebungsvariablen lesen unter C [Erledigt]

Beitrag von heinz » 09.05.2017 12:13:30

Hallo Zusammen,

ich versuche gerade mittels:

Code: Alles auswählen

char* t=getenv("LINES");
die Umgebungs-Variable LINES auszulesen. (Die auch gesetzt ist.)
Wenn ich das PGM normal starte, bekomme ich immer einen NULL-Pointer zurück. (Kennt den Variablenname nicht...)

Starte ich so:

Code: Alles auswählen

export LINES=24;./ascii-mp
funktioniert es...

Kann mir jemand erklären warum?
Es sollte doch auch ohne "export LINES=24" gehen...

Viele Grüße, heinz


[Edit]
Ein vorheriges:

Code: Alles auswählen

set -a
bringt es auch zum Funktionieren.
Werden Umgebungsvariablen nicht weiter "vererbt"?
Zuletzt geändert von heinz am 09.05.2017 13:48:35, insgesamt 1-mal geändert.

Benutzeravatar
whisper
Beiträge: 3184
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Umgebungsvariablen lesen unter C

Beitrag von whisper » 09.05.2017 12:29:17

Vermutlich, weil die Shell für dein Programm einen Prozess spant, und Kind Prozesse nur Variablen sehen, die man vorher exportiert hat.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Umgebungsvariablen lesen unter C

Beitrag von heinz » 09.05.2017 12:39:50

Hallo whisper,

Danke für die schnelle Antwort.
Ich dachte, Umgebungsvariablen sind immer "automatisch" von gestarteten Programmen lesbar...
Wieder was gelernt.

Wie erkennt dann aber z.B. mc oder less die Konsolen-Auflösung ohne ein vorhereiges exportieren von Variablen?

gruß heinz

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: Umgebungsvariablen lesen unter C

Beitrag von wanne » 09.05.2017 13:11:08

An die konsolenauflösung kommen die nochmal ganz anders aber ansonsten werden verdammt viele Variablen exportiert.
Guck dir einfach mal env oder export -p an. Das zeigt alle exportierten variablen.
heinz hat geschrieben:Ich dachte, Umgebungsvariablen sind immer "automatisch" von gestarteten Programmen lesbar...
Ja. Und Umgebungsvariablen deklarierst du in der bash mit export. (Im Gegensatz zu shell Variablen die du direkt einfach mit = deklarieren kannst.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Umgebungsvariablen lesen unter C

Beitrag von heinz » 09.05.2017 13:22:15

Hallo wanne,

Danke für den Tipp mit export.
Die Variablen LINES und COLUMNS sind in der Konsole zwar gesetzt aber werden leider nicht exportiert.
wanne hat geschrieben:An die konsolenauflösung kommen die nochmal ganz anders...
Weißt Du zufällig wie?

gruß heinz

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Umgebungsvariablen lesen unter C

Beitrag von Meillo » 09.05.2017 13:22:31

Zum Verstaendnis:
heinz hat geschrieben:

Code: Alles auswählen

export LINES=24;./ascii-mp
Dies definiert die Variable LINES in der aktuellen Shellsession und markiert sie als exportiert. Dann wird ein Kindprozess erzeugt, der die Umgebungsvariablen erbt, u.a. auch LINES.

Ein anderer Weg waere:

Code: Alles auswählen

LINES=24 ./ascii-mp
Dabei bleibt das Environment der aktuellen Shellsession unveraendert. Es wird der Kindprozess erzeugt und nur in *dessen* Environment wird die Variable LINES definiert. Das ist oft was man eigentlich haben will.

(Man beachte, dass das eine mit und das andere ohne Strichpunkt zu schreiben ist.)
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10752
Registriert: 25.09.2007 19:59:30

Re: Umgebungsvariablen lesen unter C

Beitrag von MSfree » 09.05.2017 13:40:23

heinz hat geschrieben:Wie erkennt dann aber z.B. mc oder less die Konsolen-Auflösung ohne ein vorhereiges exportieren von Variablen?
Um an die Konsolenauflösung zu kommen, gibt es die libncurses, von der less und mc regen Gebrauch machen. Damit kann man über die C-Funktion ioctl direkt die Eigenschaften des sogenannten "controlling Terminal" abfragen, ohne Umgebungsvariablen abfragen zu müssen.

Umgebungsvariablen werden zwar, wenn sie exportiert werden, an die Kindprozesse durchgereicht, aber nur als Kopie in dem Moment, als der Kindprozeß gestartet wurde. Ändert sich der Wert der Variable in der Shell, bekommt das Kind davon nichts mit.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Umgebungsvariablen lesen unter C

Beitrag von heinz » 09.05.2017 13:45:22

Hallo Meillo,
Meillo hat geschrieben:

Code: Alles auswählen

LINES=24 ./ascii-mp
Danke für den Tipp. Hätte nicht gedacht, das es ohne >;< geht.

gruß heinz

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Umgebungsvariablen lesen unter C

Beitrag von heinz » 09.05.2017 13:48:14

Hallo MSfree,
MSfree hat geschrieben:Um an die Konsolenauflösung zu kommen, gibt es die libncurses, von der less und mc regen Gebrauch machen...
Das ist, wonach ich gesucht habe. Vielen Dank.

gruß heinz

Antworten