Linux Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm Hochschule Harz FB Automatisierung und Informatik mwilhelm@hs-harz.de http://www.miwilhelm.de Raum 2.202 Tel. 03943 / 659 338 FB Automatisierung und Informatik: Linux Inhalt 1. Einführung, Literatur, Begriffe 2. Installation 3. Konsolen-Befehle, Shell, Manual 4. Komplexe Befehle (grep, find, tar, sed, cron, netcat) 5. C-Programmierung (C, IO, Thread, make) 6. Python (Sprache) 7. Python (GUI) FB Automatisierung und Informatik: Linux 2 1
Linux und C C Variablen à la Java Datentypen à la Java, auch unsigned if à la Java Schleifen à la Java, ohne foreach Prozeduren à la Java-Methoden Keine Klassen (C++, g++) I/O (Komfortables Framework) Handle-Konzept Pointer Threads und Semaphore, Mutex Zugriff auf das System (Dateien, Ordner, Prozesse) FB Automatisierung und Informatik: Linux 3 Linux und C Programme gcc g++ gdb make-datei Editoren vi, vim nano Emacs Texteditor in der GUI Übersetzen in der Konsole Debugger FB Automatisierung und Informatik: Linux 4 2
C-Programmierung Beispielcode: Ausgabe eines Textes #include <stdio.h> int main(void){ puts("hallo Wernigerode"); return 0; Übersetzen mit: gcc bsp1.c -o bsp1 -S nur kompilieren -c nur kompilieren und assemblieren -o <Datei> kompilieren, assemblieren, linken -O Optimieren -lname Library name.lib einbinden (Threads) FB Automatisierung und Informatik: Linux 5 Beispielcode: Summe von 1 bis n long long summe; // globale Variable void calc(long n) { long i; summe=0.0; for (i=0; i<=n; i++) { summe+= i; int main(int argc, char *argv[]) { calc(1000); printf("summe: %ld\n",summe); return 0; FB Automatisierung und Informatik: Linux 6 3
Beispielcode: Summe von 1 bis n long long calc(long n) { long i; summe=0.0; for (i=0; i<=n; i++) { summe+= i; if [ $# -eq 0 ] then echo "bitte einen Parameter uebergeben" echo " c bsp1" else gcc $1.c -o $1 fi int main(int argc, char *argv[]) { long long summe = calc(1000); printf("summe: %ld\n",summe); return 0; FB Automatisierung und Informatik: Linux 7 I/O-Funktionen fopen FILE *fopen (const char *Pfad, const char *Modus); Modus: r - Datei nur zum Lesen öffnen (READ) w - Datei nur zum Schreiben öffnen (WRITE), löscht den Inhalt der Datei, wenn sie bereits existiert a - Daten an das Ende der Datei anhängen (APPEND), die Datei wird nötigenfalls angelegt r+ - Datei zum Lesen und Schreiben öffnen, die Datei muss bereits existieren w+ - Datei zum Lesen und Schreiben öffnen, die Datei wird nötigenfalls angelegt a+ - Datei zum Lesen und Schreiben öffnen, um Daten an das Ende der Datei anzuhängen, die Datei wird nötigenfalls angelegt b - Binärmodus (anzuhängen an die obigen Modi, z.b. "rb" oder "w+b"). t Textdatei Modus FB Automatisierung und Informatik: Linux 8 4
I/O-Funktionen: fopen + fprintf schreiben Rückgabewert: Bei einem Fehler NULL Sonst handle für diese Datei Beispiele: #include <stdio.h> FILE *handle; handle = fopen ("testdatei.txt", "wt"); // wenn vorhanden, gelöscht if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { int i=42; fprintf (handle, "Hallo, Welt i:%d\n"); fclose (handle); IO1 FB Automatisierung und Informatik: Linux 9 I/O-Funktionen: fopen + fprintf schreiben #include <stdio.h> FILE *handle; handle = fopen ("testdatei.txt", "wt"); // wenn vorhanden, gelöscht if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { for (int i=0; i<100; i++) fprintf (handle, "%d\n",i); // %c %i %s %f %lf %ld fclose (handle); IO2 FB Automatisierung und Informatik: Linux 10 5
I/O-Funktionen: fopen + fgets lesen #include <stdio.h> FILE * handle; handle = fopen ("testdatei.txt", "rt"); if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { char s[100]; fgets (s, 100, handle); // ende wenn i>=n oder \r\n fclose (handle); puts(s); IO3 FB Automatisierung und Informatik: Linux 11 I/O-Funktionen: Parameter, fopen + fgets lesen #include <stdio.h> int main(int argc, char *argv[]) if (argc>1) { FILE * handle; handle = fopen (argv[1], "rt"); if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { char s[100]; fgets (s, 100, handle); // ende wenn i>=n oder \r\n fclose (handle); // if // if // main IO4 FB Automatisierung und Informatik: Linux 12 6
I/O-Funktionen: fopen + fprintf schreiben #include <stdio.h> int main(int argc, char *argv[]) if (argc>1) { FILE * handle; handle = fopen (argv[1], "wt"); if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { fprintf (handle, "Hallo, Welt\nHallo Hochschule\n"); fclose (handle); // if // if // main IO5 FB Automatisierung und Informatik: Linux 13 I/O-Funktionen: fopen + binär schreiben #include <stdio.h> // size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream) int main(int argc, char *argv[]) if (argc>1) { FILE * handle; handle = fopen (argv[1], "wb"); if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { for (int i=-2; i<100; i++) int n = fwrite (&i, sizeof(i), 1, handle); fclose (handle); // if // if // main IO6 FB Automatisierung und Informatik: Linux 14 7
FB Automatisierung und Informatik: Linux 15 abc im Hexeditor: 2er Komplement FB Automatisierung und Informatik: Linux 16 8
I/O-Funktionen: fopen + binär lesen int main(int argc, char *argv[]) if (argc>1) { FILE * handle; handle = fopen (argv[1], "rb"); if (handle == NULL) { printf("fehler beim Oeffnen der Datei."); else { int value; for (int i=0; i<100; i++) { int n = fread (&value, sizeof(value), 1, handle); printf("i: %d wert: %d\n",i,value); fclose (handle); // if // if // main IO7 FB Automatisierung und Informatik: Linux 17 I/O-Funktionen: fopen + binär schreiben void testwrite() { int n=102; fwrite (&n, sizeof(n), 1, handle); // vorher wissen wieviel!! for (int i=-2; i<100; i++) { int n = fwrite (&i, sizeof(i), 1, handle); void testread() { int n; int anz = fread (&n, sizeof(n), 1, handle); for (int i=0; i<n; i++) { anz = fread (&value, sizeof(value), 1, handle); printf("i: %d wert: %d anz: %d \n",i,value, anz); IO8 FB Automatisierung und Informatik: Linux 18 9
Beispielcode: Threads erzeugen // standardisierte Thread Methode void * calc(void *param) { int retcode=0; puts("im thread"); pthread_exit ( (void *) retcode ); gcc t1.c -o t1 -lpthread int main(int argc, char *argv[]) { pthread_t pt1; if ( pthread_create(&pt1, NULL, calc, NULL) ) { fprintf( stderr, "Fehler beim Erzeugen des 1. Threads\n"); exit (EXIT_FAILURE); return EXIT_SUCCESS; FB Automatisierung und Informatik: Linux 19 Beispielcode: Threads erzeugen mit Parameter t2.c struct ThreadRec { int id; long anz; int anzthreads; ; long long summe; void * calc(void *param) { long i; int von, bis, n; struct ThreadRec *pdaten; pdaten = (struct ThreadRec *) (param); int id = pdaten->id; int diff = pdaten->anz / pdaten->anzthreads; von=diff*(id-1)+1; if (id==pdaten->anzthreads) bis=pdaten->anz; else bis=diff*(id); printf("id: %d von:%d bis:%d\n",id, von,bis); for (i=von; i<=bis; i++) { summe+= i; // for FB Automatisierung und Informatik: Linux 20 10
Beispielcode: Threads erzeugen mit Parameter t2.c int main(int argc, char *argv[]) { pthread_t p1,p2; int n=10000; struct ThreadRec tdaten1; struct ThreadRec tdaten2; tdaten1.id=1; tdaten1.anz=n; tdaten1.anzthreads=2; tdaten2.id=2; tdaten2.anz=n; tdaten2.anzthreads=2; summe=0.0; FB Automatisierung und Informatik: Linux 21 Beispielcode: Threads erzeugen mit Parameter t2.c summe=0.0; if ( pthread_create(&p1, NULL, calc, &tdaten1) ) { puts("error beim Erzeugen des 1. Threads"); exit(exit_failure); if ( pthread_create(&p2, NULL, calc, &tdaten2) ) { puts("error beim Erzeugen des 2. Threads"); exit(exit_failure); printf("summe: %ld\n",summe); return 0; gcc t2.c -o t2 -lpthread FB Automatisierung und Informatik: Linux 22 11
Beispielcode: Threads erzeugen mit Parameter t3.c Problem: Die Summe ist null Es fehlt das Warten auf das Ende der Thread Lösung: pthread_join(p1,null); pthread_join(p2,null); FB Automatisierung und Informatik: Linux 23 Beispielcode: Threads erzeugen mit Parameter t4.c Problem: Die Summe ist nicht exakt (Synchronize) Lösung: pthread_mutex_t summutex; for (i=von; i<=bis; i++) { pthread_mutex_lock(&summutex); summe+= i; pthread_mutex_unlock(&summutex); pthread_mutex_init( &summutex, NULL ); FB Automatisierung und Informatik: Linux 24 12
Debugger Programm gdb Konsolen orientiert Vorgehen: vi b.c // schreiben und speichern gcc b.c ggdb3 -o b // übersetzen gdb b // Aufruf des Debuggers run // starten des Programms - l // Anzeige, list um main - r // Starten - n // next, nächster Schritt, ohne Funktion - s // step. Nächster Schritt, mit Funktion FB Automatisierung und Informatik: Linux 25 Optionen r // Starten, komplett Summe: 55 l // Listing um main l 1,30 // Listing von Zeile 1 bis 30 b 23 // Breakpoint setzen auf Zeile 23 r // Starten bis zum ersten Breakpoint oder vollständig // Angezeigt wird IMMER der nächste Befehl n // nächster Befehl, bis zum Ende r // Starten bis zum ersten Breakpoint oder vollständig // Angezeigt wird IMMER der nächste Befehl s // nächster Befehl step, in die Funktion print i // Anzeige des Inhalts von i print s // Anzeige des Inhalts von s whatis i // Anzeige des Typs von i set variable s=0 // ändern der Summe print s // Anzeige des Inhalts von s, Test c // laufen lassen bis zum Ende oder zum nächsten Breakpoint FB Automatisierung und Informatik: Linux 26 13
int summe (int n) { int i, s; s=0; for (i=0; i<=n; i++) s+=i; return s; int main(int argc, char* argv[]) { int i, n, s; int f[10]; n=10; s=summe(n); printf("summe: %d \n",s); for (i=0; i<10; i++) { f[i]=i; i=2; // für Haltepunkt return 0; Testbeispiel für das Debugging FB Automatisierung und Informatik: Linux 27 I/O mit Dateien und Verzeichnissen mkdir(char *path) Anlegen eines Verzeichnisses Rückgabe: 0=okay -1=Fehler ckdir(char *path) rmdir Wechseln in ein Verzeichnis (relativ und absolut) Rückgabe: 0=okay -1=Fehler Löscht ein leeres Verzeichnis Rückgabe: 0=okay -1=Fehler FB Automatisierung und Informatik: Linux 28 14
I/O mit Dateien und Verzeichnissen opendir Neue vereinheitliche Posix-Funktion Dir* dir = opendir(char *path) // "/home/user1" "." Anlegen eines Verzeichnisses Rückgabe: 0=okay -1=Fehler Liefert eine Liste der Einträge struct* dirent diritem = readdir(dir *dir) Gibt den i-ten Eintrag zurück Rückgabe: Fehler: NULL int closedir(dir *dir) Rückgabe: Fehler: NULL struct dirent ino_t d_ino; /* inode number */ off_t d_off; /* offset to the next dirent */ unsigned short d_reclen; /* length of this record */ unsigned char d_type; // DT_REG DT_DIR DT_UNKNOWN DT_FIFO DT_SOCK DT_CHR DT_BLK char d_name[256]; /* filename */ FB Automatisierung und Informatik: Linux 29 Aufgaben: Nachbau von mkdir cd ls grep Rekursiv ls -R find FB Automatisierung und Informatik: Linux 30 15