000
08.03.2006, 01:29 Uhr
Pler
Einer von Vielen (Operator)
|
Grundlagen
Eine kurzer Einblick was so benötigt wird und wie man erste kleine Programme schreibt. Beachtet auch die Literaturhinweise am Ende! Wer weitere Interessante Links zum Thema kennt sagt mir bitte bescheid.
Posix
Die meisten Leute lernen das Programmieren unter Windows. Sie kommen daher eigentlich automatisch mit der Windows API in Verbindung. Die Windows API bietet Systemaufrufe an, die von Benutzerprogrammen aus aufgerufen werden können, wenn diese bestimmte Dienste vom System benötigen. Das sind zum Beispiel: - Schreiben in eine Datei - Speicherverwaltung - Interprozesskommunikation (IPC) - Abfragen und setzen von Informationen über das System - Prozesssteuerung - Netzwerkprogrammierung
Anders als Windows stellt Linux keine eigene API zur Verfügung, sondern implementiert den Posix-Standard. Durch diese Implementierung stellt Linux alle wichtigen Systemaufrufe zur Verfügung. „Umsteiger“ werden an einigen Stellen Gemeinsamkeiten zur Windows API erkennen können, an anderen jedoch große Unterschiede. Posix stellt keine Funktionen zur Verfügung um irgendwelche graphischen Spielereien zu machen. Oberflächenprgrammierung ist ein anderes Thema.
Vorbereitung
Zunächst braucht man natürlich Linux. Wie man sich Linux besorgt sollte inzwischen klar sein. Oder etwa nicht? Oft - aber nicht immer - wird werden die benötigten Werkzeuge gleich mit installiert. Zumeist wird während der Installation ein Menüpunkt „Entwicklungswerkzeuge“ zur Auswahl gestellt. Von Knoppix werden inzwischen tausende Variationen angeboten. Manche mit - und mache ohne - Entwickungsumgebung. Manche auch mit halber, was zu großer Verwirrung führen kann. Wenn also die notwendigen Werkzeuge und Bibliotheken installiert sind, braucht man sich im Prinzip nur noch für einen Editor zu entscheiden. Hier bietet Linux alles vom einfachen Vi bis zur vollständigen IDE an. Für den Anfang empfehle ich jedoch einen einfachen Editor, da man hier einfach besser den Überblick behält was man eigentlich gerade tut. Anders als Notepad & Co haben die Linux-Editoren fast ausnahmslos ein hervorragendes Syntaxhighlighting und automatische Textformatierung.
Hilfe
Auch eine ausgezeichnete Hilfe wird bei Linux-Distributionen von Haus aus mitgeliefert.
Um sich noch einmal die Syntax der Funktion fopen() anzuschaun gibt man einfach man fopen in der Konsole ein.
Bash: |
$ man fopen FOPEN(3) Linux Programmer’s Manual FOPEN(3)
NAME fopen, fdopen, freopen - stream open functions
SYNOPSIS #include <stdio.h>
FILE *fopen(const char *path, const char *mode); FILE *fdopen(int fildes, const char *mode); FILE *freopen(const char *path, const char *mode, FILE *stream); [..] CONFORMING TO The fopen and freopen functions conform to ANSI X3.159-1989 (‘‘ANSI C’’). The fdopen function conforms to IEEE Std1003.1-1988 (‘‘POSIX.1’’).
SEE ALSO open(2), fclose(3), fileno(3)
|
Ganz nebenbei erfährt man noch, dass die fopen() ANSI C-Konform ist, und somit in Programmen verwendet werden kann, die auch unter zum Beispiel Windows laufen sollen. Zum Schluss gibt es immer noch Hinweise auf „verwandte“ Funktionen. In Klammern sind die Kapitel angegeben in denen die Beschreibung zu finden ist. Wie man oben sieht, kann der man auch ohne Kapitelnummer aufgerufen werden. Aber schon bei write() macht das einen Unterschied. So liefert man write nicht den erwarteten Eintrag über die C-Funktion, sondern über das gleichnahmige Kommandozeilenprogramm. Richtig muss es also man 2 write heißen.
Programme erstellen
Um die Rolle des Compilers zu erklären schreiben wir einfach ein hallowelt-Programm.
Das Programm besteht aus drei Quell-Dateien. main.c, tux.c und tux.h, die alle im gleichen Verzeichnis liegen sollen.
C++: |
// Datei: main.c #include "./tux.h"
int main( ) { ausgabe();
return 0; }
|
C++: |
// Datei: tux.c #include "./tux.h"
void ausgabe( void ) { write( STDOUT_FILENO , "Hallo Welt" , 10 ); }
|
C++: |
// Datei: tux.h #include <unistd.h>
void ausgabe( void );
|
Zugegeben: Dieses Programm wird jetzt niemanden vom Hocker reißen, aber man kann hier gleich mehrere Dinge zeigen. So wird bereits die erste Posix-Funktion verwendet. Nämlich write(). Das define STDOUT_FILENO wird ebenfalls durchunistd.h bereitgestellt. Dieses define ist einfach 1 und sagt der write(), dass es die Standardausgabe verwenden soll. Dateipfade sollten übrigens immer mit / angegeben werden. Die bei Windows üblichen \ mag Linux nicht.
Wie macht man das Programm ausführbar?
Zunächst werden aus den Quelldateien Objektdateien erstellt:
bash: |
$ cc -c main.c -o main.o $ cc -c tux.c -o tux.o
|
Und schließlich das ganze zu einem ausführbaren Programm zusammenlinken:
bash: |
$ cc -o hallowelt main.o tux.o
|
Jetzt kann man sich die Früchte der Arbeit anschauen:
bash: |
$ ./hallowelt Hallo Welt
|
Es wäre natürlich ziemlich umständlich das ganze immer von Hand zu machen, deshalb verwendet man dazu make. make verlangt im aktuellen Verzeichnis ein Makefile. Darin werden Regeln beschrieben die make verwendet um ein ausführbares Programm zu erstellen.
Makefile: |
hallowelt: main.o tux.o cc -o hallowelt main.o tux.o
main.o: main.c tux.h cc -c main.c -o main.o
tux.o: tux.c tux.h cc -c tux.c -o tux.o
clean: rm -f *.o hallowelt
|
Durch diese einfache Datei (ja, sie heißt auch einfach nur Makefile, das ist Konvention) lässt sich der ganze Erstellungsprozess automatisieren.
bash: |
$ make clean rm -f *.o hallowelt $ make cc -c main.c -o main.o cc -c tux.c -o tux.o cc -o hallowelt main.o tux.o $ ./hallowelt Hallo Welt
|
Wenn ein Programm nur aus einer einzigen .c-Datei besteht, kann man es auch einfach mit make dateiname übersetzen. (Der Dateiname muss ohne die Erweiterung .c angegeben werden.) Ein Makefile ist dann nicht mehr notwendig.
Überblick
Ein Überblick was mit Systemprogrammierung noch so alles verbrochen werden kann.
Ein- und Ausgabe
Neben den Standard-C-Funktionen stellt Linux noch elementare E/A-Funktionen wie write() und read zur Verfügung. Außerdem ist der Zugriff auf Dateien und Verzeichnisse betriebssystemabhänig.
Informationen zum System und zu Benutzern
Es werden eine Reihe von Funktionen zur Verfügung gestellt um Informationen aus wichtigen Dateien zu erhalten. (Zum Beispiel /etc/passwd). Systemmeldungen können abgefangen werden durch die Auswertung der Umgebungsvariablen werden weitere interessante Informationen gewonnen.
Beispiel:
C++: |
// datei: umgebung.c #include <stdio.h>
extern char** environ;
int main() { char** temp;
for( temp = environ ; *temp != NULL ; ++temp ) { printf( "%s\n" , *temp ); }
return 0; }
|
Prozesse und Prozesskommunikation
Mit Hilfe verschiedener Funktionen lassen sich Prozesse erzeugen und steuern. Durch den Aufruf von fork() kann man zum Beispiel jederzeit einen sogenannten Kindprozess erzeugen. Natürlich können innerhalb der Prozesse auch Threads erzeugt werden.
Unter dem Begriff Prozesskommunikation versteht man alle möglichen Formen wie Prozessen sich gegenseitig beeinflussen können. Ein einfaches Beispiel wäre, dass ein Prozess in eine Datei schreibt und ein anderer aus ihr ließt. Greifen verschiedene Prozesse auf gemeinsame Ressourcen zu, muss der Ganze Vorgang gesteuert werden um inkonsistente Daten und Abstürze zu verhindern.
Weitere Möglichkeiten der Interprozesskommunikation sind u.a.: - Signale - Shared Memory - Pipes und FIFOS - Message-Queues - Semaphoren - normale Dateien - Client-Server über TCP/IP
Auf all diese Themen hier noch weiter zu vertiefen würde hier zu weit gehen. Ein Client-Server-Beispiel und weiteres befindet sich auch schon im FAQ-Teil dieses Forums.
Viel Spaß noch mit Linux!
Quellen:
Dieses Forum Wikipedia Linux/Unix-Systemprogrammierung Advanced Linux Programming Programming Linux The Linux Programmer's Guide
Literatur:
Advanced Linux Programming (englisch, frei) Linux/Unix Systemprogrammierung (deutsch) The Linux Programmer's Guide (englisch, frei) Make - a tutorial (englisch, frei) Linux-Programmierung (deutsch,englisch) Linux-Unix-Programmierung (deutsch,frei) C-Programmierung unter Linux (In 21 Tagen) (deutsch, frei)
ferner: C++-Entwicklung mit Linux (deutsch, frei) YoLinux Tutorial: C++ Software Development (englisch, Tutorial- und Linksammlung) Für Fragen neue Themen aufmachen. Beschwerden und Hinweise einfach per PN an mich. Dieser Post wurde am 17.10.2007 um 10:33 Uhr von Pler editiert. |