Programming lesson
C-Programmierung: Benutzer- und Umgebungsvariablen auslesen – Ein praktischer Einstieg (CSCI 493.66 Assignment 1)
Lerne, wie du in C Benutzername, User-ID, Home-Verzeichnis und Umgebungsvariablen wie SHELL oder DISPLAY ausliest – mit einem praxisnahen Beispiel aus dem Uni-Alltag. Ideal für Programmieranfänger und Studierende der Informatik.
Einführung in die Systemprogrammierung mit C
Die Programmiersprache C ist nach wie vor eine der wichtigsten Sprachen für systemnahe Entwicklung. Besonders im Bereich der Betriebssysteme, Embedded Systems und Hochleistungsanwendungen kommt sie häufig zum Einsatz. Für Studierende der Informatik, die mit C noch nicht vertraut sind, ist das CSCI 493.66 Assignment 1 eine ideale Gelegenheit, erste Erfahrungen mit Systemaufrufen und Umgebungsvariablen zu sammeln. In diesem Tutorial lernst du, wie du Benutzername, User-ID, Home-Verzeichnis und entweder die SHELL- oder DISPLAY-Variable ausliest und formatierst ausgibst.
Was du in diesem Tutorial lernst
- Grundlegende C-Programmstruktur:
#include,main(),printf() - Systemfunktionen wie
getpwuid(),getuid(),getenv() - Umgang mit Zeichenketten in C:
strcpy(),sprintf() - Bedingte Ausgabe basierend auf der User-ID (gerade/ungerade)
- Fehlerbehandlung und Kompilierung mit
gcc
Die Aufgabenstellung verstehen
Dein Programm soll zwei Zeilen ausgeben. Die erste Zeile enthält den Benutzernamen, die User-ID und den absoluten Pfad des Home-Verzeichnisses. Die zweite Zeile ist entweder die SHELL-Variable (wenn die User-ID gerade ist) oder die DISPLAY-Variable (wenn die User-ID ungerade ist). Das klingt zunächst einfach, erfordert aber das Verständnis von Systemfunktionen und der Formatierung mit printf().
Benötigte Header-Dateien und Funktionen
Um die Benutzerinformationen zu erhalten, benötigst du die Header-Dateien <stdio.h>, <stdlib.h>, <unistd.h>, <pwd.h> und <string.h>. Die Funktion getuid() liefert die numerische User-ID, getpwuid() gibt einen Zeiger auf eine struct passwd zurück, die Felder wie pw_name (Benutzername) und pw_dir (Home-Verzeichnis) enthält. Für Umgebungsvariablen verwendest du getenv().
Schritt-für-Schritt-Anleitung
1. Grundgerüst des Programms
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pwd.h>
#include <string.h>
int main() {
// Dein Code hier
return 0;
}2. Benutzerinformationen abrufen
Rufe getuid() auf, um die User-ID zu erhalten. Übergib diese an getpwuid(), um die Passwort-Struktur zu bekommen. Prüfe, ob der Rückgabewert nicht NULL ist – sonst liegt ein Fehler vor.
uid_t uid = getuid();
struct passwd *pw = getpwuid(uid);
if (pw == NULL) {
fprintf(stderr, "Fehler: Benutzer nicht gefunden.\n");
return 1;
}3. Ausgabe der ersten Zeile formatieren
Verwende printf(), um den Satz genau wie gefordert auszugeben. Achte auf die exakte Zeichensetzung.
printf("My username is %s, my userid is %d, and my home directory is %s.\n",
pw->pw_name, uid, pw->pw_dir);4. Bedingte Ausgabe der zweiten Zeile
Prüfe mit dem Modulo-Operator %, ob die User-ID gerade oder ungerade ist. Wenn uid % 2 == 0, gib die SHELL-Variable aus, sonst die DISPLAY-Variable.
if (uid % 2 == 0) {
char *shell = getenv("SHELL");
if (shell != NULL)
printf("My SHELL is %s.\n", shell);
else
printf("SHELL not set.\n");
} else {
char *display = getenv("DISPLAY");
if (display != NULL)
printf("The value of my DISPLAY variable is %s.\n", display);
else
printf("DISPLAY not set.\n");
}5. Kompilieren und Testen
Speichere das Programm als hwk1.c und kompiliere es mit gcc -o hwk1 hwk1.c. Führe es mit ./hwk1 aus. Die Ausgabe sollte wie im Aufgabenblatt aussehen.
Häufige Fehler und wie du sie vermeidest
- Fehlerhafte Formatierung: Achte auf Punkte und Leerzeichen. Der Satz muss exakt übereinstimmen.
- Vergessen von Headern: Ohne
<pwd.h>und<unistd.h>gibt es Compiler-Fehler. - Nichtbeachtung der User-ID-Bedingung: Verwende
% 2und nicht% 1. - Fehler bei
getenv(): Die Funktion gibtNULLzurück, wenn die Variable nicht gesetzt ist – fange das ab.
Erweiterungsideen für dein C-Projekt
Wenn du das Grundprogramm verstanden hast, kannst du es erweitern: Gib zusätzliche Informationen wie die Gruppen-ID (getgid()) oder den vollen Namen aus pw_gecos aus. Oder lies mehrere Umgebungsvariablen aus und gib sie formatiert aus. Das ist besonders nützlich, wenn du dich auf eine C-Programmierprüfung vorbereitest oder dein C-Programmierprojekt für die Uni umsetzt.
Praktische Tipps für den Uni-Alltag
In vielen Informatikkursen wird erwartet, dass du Programme auf einem Server wie cslab ausführst. Logge dich mit SSH ein, erstelle eine Datei mit vim oder nano und kompiliere mit gcc. Nutze man, um Details zu Funktionen nachzuschlagen – zum Beispiel man 3 printf oder man getpwuid. Das spart Zeit und trainiert den Umgang mit der Dokumentation.
Beispielausgabe
Angenommen, dein Benutzername ist sweiss, die User-ID ist 1220 (gerade) und das Home-Verzeichnis ist /data/biocs/b/cshome/sweiss. Dann sieht die Ausgabe so aus:
My username is sweiss, my userid is 1220, and my home directory is /data/biocs/b/cshome/sweiss.
My SHELL is /bin/bash.Wenn die User-ID ungerade wäre (z.B. 1221), würde stattdessen die DISPLAY-Variable ausgegeben.
Zusammenfassung
Mit diesem Tutorial hast du gelernt, wie du in C auf Systeminformationen zugreifst und sie formatiert ausgibst. Das CSCI 493.66 Assignment 1 ist eine typische Aufgabe für Einsteiger in die Systemprogrammierung. Durch das Verständnis von getpwuid(), getenv() und der bedingten Ausgabe bist du gut gerüstet für weitere Projekte. Viel Erfolg bei der Abgabe!
„Programmieren lernt man nur durch Programmieren.“ – Brian Kernighan