Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Programmieren unter Linux, oder: Linux und C/C++

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: