Foliensatz 3: System Calls Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Ähnliche Dokumente
fork () Hans-Georg Eßer, Hochschule München Betriebssysteme I, SS Prozesse (2/2) Folie 4

Fortgeschrittene I/O

Threads. Foliensatz 8: Threads Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Hans-Georg Eßer, Hochschule München, Betriebssysteme I, SS Speicherverwaltung 1

9.3 Virtuelle FS Linux VFS Windows IFS 9.4 Dateizugriff in Linux-Programmen

Betriebssysteme I SS 2008 Hans-Georg Eßer, Hochschule München Zusammenfassung Seite 1

3. Interrupts. Betriebssysteme I Hochschule München Hans-Georg Eßer SS Foliensatz 3 Interrupts

Hans-Georg Eßer, Hochschule München Betriebssysteme I, SS Synchronisation (1) Folie 3

Betriebssysteme BS-D SS Hans-Georg Eßer Dipl.-Math., Dipl.-Inform. Foliensatz D: Interrupts und Faults System Calls. v1.

Foliensatz 2: Prozesse und Threads. Hans-Georg Eßer, Hochschule München Betriebssysteme I, Sommersemester Folie 3

Betriebssystem-Entwicklung mit Literate Programming

Projekt: Web-Server. Foliensatz 9: Projekt Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2014

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

U23 - Shellcode. Twix Chaos Computer Club Cologne. Motivation Einstieg Der erste Shellcode Nullbytes, NOP Slides

Eine Mini-Shell als Literate Program

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Verzeichnisse. Foliensatz 5: Dateien und Verzeichnisse Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Linux Prinzipien und Programmierung

Übung 1 - Betriebssysteme I

Assembler - Einleitung

Fallbeispiel Unix. Betriebssysteme. Hermann Härtig TU Dresden

#define N 5 // Anzahl der Philosophen. while (TRUE) { // Der Philosoph denkt

Betriebssysteme I. Hochschule München Fakultät für Informatik und Mathematik Sommersemester Hans-Georg Eßer

System Monitoring mit strace. Systemcall tracing

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Tafelübung zu BS 1. Prozesse verwalten

Hinweise C-Programmierung

U23 Assembler Workshop

Embedded-Linux-Seminare. Linux als Betriebssystem

Betriebssysteme BS-V SS Hans-Georg Eßer. Foliensatz V: Ulix: Interrupts und Faults Ulix: System Calls. Dipl.-Math., Dipl.-Inform.

Betriebssysteme Übung 2. Tutorium System Calls & Multiprogramming

FILE *fp; char fname[100];... fp = fopen (fname, rb ); if( fp == NULL ) { perror( fopen );... } // Fehlernachricht auf letzten Fehler, der aufkam

Was ist ein Prozess?

Karlsruher Institut für Technologie

Ausgewählte Themen. In diesem Teil werden ausgewählte Themen vorgestellt: Fehlerbehandlung Dämonen Zombies. Inhalt. 1. Fehlerbehandlung...

U23 Assembler Workshop

Dämon-Prozesse ( deamon )

Assembler Unterprogramme

ggf. page fault virtuelle Adresse physikalische Adresse Hauptspeicher Seitenrahmen Register Seitentabelle logical address page number frame number

Betriebssysteme KU - Einführungstutorium

Hardware-Programmierung mit Linux/NASM

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Projekt: Web-Proxy. Foliensatz 9: Projekt Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2015

Tafelübung zu BS 4. Dateioperationen

Speicherverwaltung. Foliensatz 7: Speicherverwaltung Folie 1. Hans-Georg Eßer, TH Nürnberg Systemprogrammierung, Sommersemester 2013

2. Aufgabenblatt Musterlösung

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Lösung Übungszettel 6

4.4 Prozesse. H. Weber, HS RM SS 2010 Systemprogrammierung Kap. 4.4 Seite 1 von 22

Betriebssysteme BS-H WS 2014/15. Hans-Georg Eßer. Foliensatz H: Zusammenfassung. Dipl.-Math., Dipl.-Inform. v1.0, 2015/01/10

Tafelübung zu BS 1. Prozesse verwalten

Prozesse, Logs und Systemverwaltung

Assembler (NASM) Crashkurs von Sönke Schmidt

Assembler - Adressierungsarten

Dateizugriff unter C

DOSEMU. Vortrag im Hauptseminar Konzepte und Techniken virtueller Maschinen und Emulatoren. Matthias Felix FAU. 13.

Netzwerk-Programmierung. Prozesse. Alexander Sczyrba Michael Beckstette.

Systemprogrammierung

File I/O. Persistieren von Daten. Gastvorlesung Ralph Erdt erdt (bei) informatik.fh-wiesbaden.de

Prozesse. Netzwerk - Programmierung. Alexander Sczyrba Madis Rumming

Malware. Carlo U. Nicola 09. Dezember Die Struktur eines (harmlosen) aber echten Virus-Programmes analysieren;

1. Aufgabenblatt Unix

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

Prozesse und Threads. Gliederung. Prozesse und Threads. Wozu Prozesse? Übersicht: 1. Einführung und Übersicht. 2. Prozesse und Threads. 3.

Rechnerarchitektur und Betriebssysteme (CS201): Frühe Betriebssysteme, geschützte CPU-Befehle, CPU-Modus

Just-In-Time-Compiler (2)

Beispiel Block 2 Stream I/O Parallele Prozesse: fork, exec und wait Interprozesskommunikation mit Unnamed Pipes

Einführung in die Programmiersprache C

Foliensatz 5: Synchronisation. Hans-Georg Eßer, Hochschule München Betriebssysteme I, Sommersemester Folie 3. Foliensatz 5: Synchronisation

Bash-Skripting Linux-Kurs der Unix-AG

Linux Prinzipien und Programmierung

2A Basistechniken: Weitere Aufgaben

Einführung in die C-Programmierung

x86 Assembler Praktische Einführung Sebastian Lackner Michael Müller 3. Juni 2013

Mikroprozessoren Grundlagen AVR-Controller Input / Output (I/O) Interrupt Mathematische Operationen

Just-In-Time-Compiler (2)

2Binden 3. und Bibliotheken

4. Foliensatz Betriebssysteme und Rechnernetze

6. Grundlagen der Programmierung

Programmiersprachen Einführung in C

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Bash-Skripting Linux-Kurs der Unix-AG

Übersicht. Virtuelle Maschinen Erlaubnisse (Permission, Rechte) Ringe. AVS SS Teil 12/Protection

x86 Open Source Virtualisierungstechniken Thomas Glanzmann

Threads. Netzwerk - Programmierung. Alexander Sczyrba Jan Krüger

Messwerterfassung mit Mittelwertbildung

Systemprogrammierung

Interprozesskommunikation

Aufgabe 1 Entwicklung einer Virtuellen Maschine

"Organisation und Technologie von Rechensystemen 4"

UNIX/Linux Lösung. Mär 14, 17 20:40 Seite 1/6. Prozeßsynchronisation (was ist das?, wo kommt es vor?, Beispiel?):

Netzwerksicherheit Musterlösung Übungsblatt 4: Viren

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

Schachtelung der 2. Variante (Bedingungs-Kaskade): if (B1) A1 else if (B2) A2 else if (B3) A3 else if (B4) A4 else A

Shell-Scripting Linux-Kurs der Unix-AG

Shell-Scripting Linux-Kurs der Unix-AG

Einführung in die Programmiersprache C

Transkript:

Sep 19 14:20:18 amd64 sshd[20494]: Accepted rsa for esser from ::ffff:87.234.201.207 port 61557 Sep 19 14:27:41 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 01:00:01 amd64 /usr/sbin/cron[29278]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 20 01:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 02:00:01 amd64 /usr/sbin/cron[30103]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 20 02:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 12:46:44 amd64 sshd[6516]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62004 Sep 20 12:46:44 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 12:48:41 amd64 sshd[6609]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62105 Sep 20 12:54:44 amd64 sshd[6694]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62514 Sep 20 15:27:35 amd64 sshd[9077]: Accepted rsa for esser from ::ffff:87.234.201.207 port 64242 Sep 20 15:27:35 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 16:37:11 amd64 sshd[10102]: Accepted rsa for esser from ::ffff:87.234.201.207 port 63375 Sep 20 16:37:11 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 20 16:38:10 amd64 sshd[10140]: Accepted rsa for esser from ::ffff:87.234.201.207 port 63546 Sep 21 01:00:01 amd64 /usr/sbin/cron[17055]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 21 01:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 21 02:00:01 amd64 /usr/sbin/cron[17878]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 21 02:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 21 17:43:26 amd64 sshd[31088]: 3. Accepted System rsa for esser from ::ffff:87.234.201.207 port 63397 Calls Sep 21 17:43:26 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 21 17:53:39 amd64 sshd[31269]: Accepted rsa for esser from ::ffff:87.234.201.207 port 64391 Sep 21 18:43:26 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 21 19:43:26 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 22 01:00:01 amd64 /usr/sbin/cron[4674]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 22 01:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 22 02:00:01 amd64 /usr/sbin/cron[5499]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 22 02:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 22 20:23:21 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 23 01:00:01 amd64 /usr/sbin/cron[24739]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 23 01:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 23 02:00:01 amd64 /usr/sbin/cron[25555]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 23 02:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 23 18:04:05 amd64 sshd[6554]: Accepted publickey for esser from ::ffff:192.168.1.5 port 59771 ssh2 Sep 23 18:04:05 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 23 18:04:34 amd64 sshd[6606]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62093 Sep 24 01:00:01 amd64 /usr/sbin/cron[12436]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 24 01:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 24 02:00:01 amd64 /usr/sbin/cron[13253]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 24 02:00:01 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 24 11:15:48 amd64 sshd[20998]: Accepted rsa for esser from ::ffff:87.234.201.207 port 64456 Sep 24 11:15:48 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 24 13:49:08 amd64 sshd[23197]: Accepted rsa for esser from ::ffff:87.234.201.207 port 61330 Sep 24 13:49:08 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 24 15:42:07 amd64 kernel: snd_seq_midi_event: unsupported module, tainting kernel. Sep 24 15:42:07 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 24 15:42:07 amd64 kernel: snd_seq_oss: unsupported module, tainting kernel. Sep 24 20:25:31 amd64 sshd[29399]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62566 Sep 24 20:25:31 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 01:00:02 amd64 /usr/sbin/cron[662]: (root) CMD (/sbin/evlogmgr -c "severity=debug") Sep 25 01:00:02 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 02:00:01 amd64 /usr/sbin/cron[1484]: (root) CMD (/sbin/evlogmgr -c 'age > "30d"') Sep 25 02:00:02 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 10:59:25 amd64 sshd[8889]: Accepted rsa for esser from ::ffff:87.234.201.207 port 64183 Sep 25 10:59:25 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 10:59:47 amd64 sshd[8921]: Accepted rsa for esser from ::ffff:87.234.201.207 port 64253 Sep 25 11:30:02 amd64 sshd[9372]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62029 Sep 25 11:59:25 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 14:05:37 amd64 sshd[11554]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62822 Sep 25 14:05:37 amd64 syslog-ng[7653]: STATS: dropped 0 Sep 25 14:06:10 amd64 sshd[11586]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62951 Sep 25 14:07:17 amd64 sshd[11608]: Accepted rsa for esser from ::ffff:87.234.201.207 port 63392 Sep 25 14:08:33 amd64 sshd[11630]: Accepted rsa for esser from ::ffff:87.234.201.207 port 63709 Sep 25 15:25:33 amd64 sshd[12930]: Accepted rsa for esser from ::ffff:87.234.201.207 port 62778 Folie 1

Grundlagen System Calls (1) Prozessor kennt verschiedene Schutzstufen Ring 0: Kernel Mode / Supervisor Mode voller Zugriff auf alle Ressourcen alle CPU-Instruktionen erlaubt hier läuft das Betriebssystem Ring 3: User Mode eingeschränkter Zugriff auf Ressourcen privilegierte Instruktion verboten hier laufen Anwendungen Ringe 1, 2: nicht benutzt Ring 3 Ring 2 Ring 1 Ring 0 Kernel Anwendungen Folie 2

Grundlagen System Calls (2) Anwendung kann nicht direkt auf Hardware zugreifen keine Plattenzugriffe keine I/O (USB, Firewire, seriell etc.) kein Zugriff auf Bildschirmspeicher Tastatur / Maus physikalisches RAM (aber: virtueller Speicher) Folie 3

Grundlagen System Calls (3) Anwendung muss Dienste des Betriebssystems nutzen kontrollierter Übergang von Ring 3 Ring 0 über ein Gate realisiert über System Calls / Software Interrupts kein direkter Sprung in BS-Funktion (call os_print), sondern Verwendung von Software-Interrupt (int): mov eax, OS_PRINT mov ebx, Stringadresse int 0x80 danach Rücksprung in Ring 3 (iret) Folie 4

Grundlagen System Calls (4) BS-Funktionen prüfen beim Aufruf, ob Anwender berechtigt ist; können Ausführung verweigern während System Call läuft: veränderte Sicht auf Speicher (Zugriff auf Prozessspeicher und auf Kernel-Speicher) nach System Call: Rücksprung in User-Mode, Programm erhält Rückgabewert Folie 5

Einfaches Beispiel (1) Ziel: Ausgabe von A im Textmodus (80x25) in linker oberer Ecke technisch: Bildschirmspeicher: 80 x 25 x 2 Bytes ab 0xB8000 erste zwei Bytes für Position links oben zuständig (ASCII- Code und Farbe) Aufgabe: char *addr=0xb8000; *addr='a'; Problem: Anwendung nutzt virtuellen Speicher, Adresse 0xB8000 nicht erreichbar Folie 6

Einfaches Beispiel (2) Lösungsansatz: Betriebssystem hat Funktion write_screen: int write_screen (short spalte, zeile, char c) { int addr = 0xB8000 + 2 * spalte + 160 * zeile; char *ptr = (char*) addr; *ptr = c; return 0; } Anwendung müsste write_screen (0, 0, 'A'); aufrufen wie kommt sie da ran? Folie 7

Einfaches Beispiel (3) Betriebssystem installiert System-Call-Handler für verschiedene Dienste, z. B. write_screen: #define SYSCALL_WRITE_SCREEN 101 int syscall_handler_0x80 (int eax,...) { switch (eax) { case SYSCALL_WRITE_SCREEN: // call write_screen (syscall 101) // ebx: column, ecx: row, edx: char write_screen (ebx, ecx, edx); break; case SYSCALL_...:... }; asm (iret); }; Folie 8

Einfaches Beispiel (4) Programm lädt passende Werte in Register (Linux): asm ( mov eax, 101 // syscall no. mov ebx, 0 // column mov ecx, 0 // row mov edx, 'A' // char int 0x80 // software int. 0x80 ); Alternative Implementierung über Stack (z. B. FreeBSD): asm ( mov eax, 101 push 'A' push 0 push 0 int 0x80 ); // syscall no. // char // row // column // software int. 0x80 Folie 9

Exkurs Intel x86 Assembler (1) Nur das wichtigste zu Assembler C-Compiler übersetzt C-Programme in Assemblersprache, Assembler übersetzt diese in Maschinensprache (ein Binary) 32-bittige CPU: Adressen sind 32 Bit breit, Register auch: EAX, EBX, ECX, ; C-Typ int genau passend Spezialregister: EIP, ESP, EFLAGS, siehe http://de.wikipedia.org/wiki/intel_80386#register Folie 10

Exkurs Intel x86 Assembler (2) Befehlsausführung: linear Sprungbefehle Schleifen sehen in Assembler immer so aus (Pseudosyntax): << Variablen für Schleife initialisieren >> start: << Schleifenrumpf >> << Test Abbruchbedingung >> if (! Test) jump to start; // hinter der Schleife Folie 11

Exkurs Intel x86 Assembler (3) Assembler-Code angucken: gcc -S -masm=intel Beispiel: int main () { register int i,j,k; i = 0x1234; j = 0x5678; if (i<j) { k = j - i; } else { k = i - j; }; return k; } main: push ebp mov push ebp, esp esi push ebx mov mov esi, 0x1234 ebx, 0x5678 cmp esi, ebx jge sub.l2 ebx, esi jmp.l3.l2: mov eax, esi sub mov eax, ebx ebx, eax.l3: mov eax, ebx pop ebx pop esi pop ret ebp Folie 12

Exkurs Intel x86 Assembler (4) Ausgabe von gcc -S... main: push ebp mov ebp, esp push push esi ebx mov mov esi, 0x1234 ebx, 0x5678 cmp jge esi, ebx.l2 sub ebx, esi jmp.l3.l2: mov eax, esi sub eax, ebx mov ebx, eax.l3: mov eax, ebx pop pop ebx esi pop ebp ret Disassemblieren der erzeugten Object-Datei (a.out) mit Tool udcli, http://udis86.sourceforge.net/ 00000394 55 00000395 89e5 push ebp mov ebp, esp 00000397 56 00000398 53 push esi push ebx 00000399 be34120000 0000039e bb78560000 mov esi, 0x1234 mov ebx, 0x5678 000003a3 39de cmp esi, ebx 000003a5 7d04 000003a7 29f3 jge 0x3ab sub ebx, esi 000003a9 eb06 jmp 0x3b1 000003ab 89f0 000003ad 29d8 000003af 89c3 000003b1 89d8 000003b3 5b 000003b4 5e 000003b5 5d 000003b6 c3 mov eax, esi sub eax, ebx mov ebx, eax mov eax, ebx pop ebx pop esi pop ebp ret Folie 13

Echtes Beispiel: Text ausgeben section.text global _start _start: ;fuer den Linker (ld) ;fuer Linker (wo gehts los) section.data mov edx,len ;Nachrichtenlaenge mov ecx,msg ;Adresse der Nachricht mov ebx,1 ;file descriptor (1=stdout) mov eax,4 ;Syscall-Nr. (sys_write) int 0x80 ;Syscall ausfuehren mov eax,1 ;Syscall-Nr. (sys_exit) int 0x80 ;Syscall ausfuehren msg db 'Hallo Welt!',0xa ;Text len equ $ - msg ;Laenge Quelle des Listings: http://asm.sourceforge.net/intro/hello.html (übersetzt) - Syntax für Assembler nasm geeignet Folie 14

Welche Syscalls gibt es? In /usr/include/asm/unistd_32.h oder /usr/include/asm/unistd_64.h für 64 Bit: # grep -c NR unistd_32.h 335 (335 System Calls) #define NR_restart_syscall 0 #define NR_exit 1 #define NR_fork 2 #define NR_read 3 #define NR_write 4 #define NR_open 5 #define NR_close 6 #define NR_waitpid 7 #define NR_creat 8 #define NR_link 9 #define NR_unlink 10 #define NR_execve 11 #define NR_chdir 12 #define NR_time 13 #define NR_mknod 14 #define NR_chmod 15 #define NR_lchown 16 #define NR_break 17 #define NR_oldstat 18 #define NR_lseek 19 #define NR_getpid 20... Folie 15

Wichtige Syscalls fork: erzeugt (fast) identischen Sohn-Prozess exec: lädt anderes Programm in aktuellen Prozess wait: wartet auf Ende eines Sohn-Prozesses open: Datei öffnen (Spezialfall: creat) read: aus Datei lesen write: in Datei schreiben close: Datei schließen Folie 16

Syscalls und Funktionen Für jeden Syscall (z. B. exec) gibt es gleichnamige Funktion (z. B. exec() ). Die Funktion führt den eigentlichen Syscall aus setzt Register führt int 0x80 aus (älteres 32-Bit-Linux; neuere Versionen nutzen sysenter) wertet Rückgabewert aus Folie 17

Prozesse Hierarchie Prozesse erzeugen einander Erzeuger heißt Vaterprozess (parent process), der andere Kindprozess (child process) Kinder sind selbständig (also: eigener Adressraum, etc.) Nach Prozess-Ende: Rückgabewert an Vaterprozess Folie 18

Prozesse erzeugen (1/7) Neuer Prozess: fork () main() { int pid = fork(); /* Sohnprozess erzeugen */ if (pid == 0) { printf("ich bin der Sohn, meine PID ist %d.\n", getpid() ); } else { printf("ich bin der Vater, mein Sohn hat die PID %d.\n", pid); } } erzeugt neuen Prozess Rückgabewert im Vater: PID des Sohnes Rückgabewert im Sohn: 0 Folie 19

Prozesse erzeugen (2/7) Anderes Programm starten: fork + exec main() { int pid = fork(); /* Sohnprozess erzeugen */ if (pid == 0) { /* Sohn startet externes Programm */ execl( "/usr/bin/gedit", "/etc/fstab", (char *) 0 ); } else { printf("es sollte jetzt ein Editor starten...\n"); } } Andere Betriebssysteme oft nur: spawn main() { WinExec("notepad.exe", SW_NORMAL); /* Sohn erzeugen */ } Folie 20

Prozesse erzeugen (3/7) Warten auf Sohn-Prozess: wait () #include <unistd.h> /* sleep() */ main() { int pid=fork(); /* Sohnprozess erzeugen */ if (pid == 0) { sleep(2); /* 2 sek. schlafen legen */ printf("ich bin der Sohn, meine PID ist %d\n", getpid() ); } else { printf("ich bin der Vater, mein Sohn hat die PID %d\n", pid); wait(); /* auf Sohn warten */ } } Folie 21

Prozesse erzeugen (4/7) Wirklich mehrere Prozesse: Nach fork () zwei Prozesse in der Prozessliste > pstree grep simple... -bash---simplefork---simplefork > ps w grep simple 25684 pts/16 S+ 0:00./simplefork 25685 pts/16 S+ 0:00./simplefork Folie 22

Prozesse erzeugen (5/7) Abfrage, ob Programmstart über fork(), exec() erfolgreich war: #include <errno.h> main() { int pid = fork(); int errno2; if (pid==0) { execl("/bin/xls",0); errno2=errno; perror (); printf("fehlercode errno = %d\n", errno2); } else { wait(); } } > gcc -o fork-exec-fail fork-exec-fail.c >./fork-exec-fail /bin/xls: No such file or directory Fehlercode errno = 2 perror(): Fehlermeldung in lesbarem Format errno: Globale Fehlervariable mehr zu errno/perror: gleich... Folie 23

Prozesse erzeugen (6/7) Abbruch aller Kind-Prozesse Zwei Szenarien: 1. Shell wird mit exit verlassen Kind-Prozesse laufen weiter. 2. Shell wird gewaltsam geschlossen (kill, Fenster schließen etc.) Kind-Prozesse werden auch beendet. Folie 24

Prozesse erzeugen (7/7) [ In 2. Fenster ] > nedit & > pstree grep nedit -xterm---bash---nedit > ps auxw grep nedit esser 24676 1.0 0.8 8248 4336 pts/4 S 15:13 0:00 nedit > cat /proc/24676/status grep PPid PPid: 24659 > ps auxw grep 24659 esser 24659 0.0 0.3 4424 1936 pts/4 Ss+ 15:12 0:00 bash [ In 2. Fenster ] > exit > cat /proc/24676/status grep PPid PPid: 1 Folie 25

Dokumentation fork: man 2 fork exec (mehrere Varianten): man exec execl: absoluter Programmpfad, Argumente separat, mit Nullzeiger abgeschlossen execlp: Programmname, Argumente separat, mit Nullzeiger abgeschlossen execle: wie execl, zusätzlich Environment nach Argumentliste execv: wie execl, aber Argumente als Array execve: wie execv, plus Environment execvp: wie execlp, aber Argumente als Array Folie 26

Dokumentation wait: man wait wait: wartet auf beliebigen Prozess waitpid: wartet auf Prozess mit angegebener PID (oder auf beliebigen Prozess, wenn -1 übergeben wird; oder auf Prozess, der zur Prozessgruppe PGID gehört, wenn Argument PGID übergeben wird) wait (&stat) = waitpid (-1, &stat, 0) wait und waitpid geben auch Status des (beendeten) Sohnprozesses zurück ( später) Folie 27

Dateizugriffe (1) Neue Datei erzeugen: creat() #include <sys/types.h> #include <sys/stat.h>... char filename[]="datei.txt"; int fd = creat ((char*)&filename, S_IRUSR S_IWUSR); Datei öffnen: open() #include <fcntl.h>... char filename[]="datei.txt"; int fd = open ((char*)&filename, O_RDONLY); Folie 28

Dateizugriffe (2) Optionen beim Öffnen (O_RDONLY etc.) stehen in /usr/include/asm-generic/fcntl.h O_RDONLY: nur lesen O_WRONLY: nur schreiben O_RDWR: lesen/schreiben,... Attribute beim Erzeugen (S_IRUSR etc.) stehen in /usr/include/sys/stat.h S_IRUSR: Leserechte für Besitzer S_IWGRP: Schreibrechte für Gruppe,... Folie 29

Dateizugriffe (3) Zugriffsrechte (mode) bei creat(f, mode) bzw. open (f, O_CREAT, mode) werden durch umask beeinflusst: tatsächliche Rechte: mode & ~umask umask setzen mit umask (maske) Beispiel: Folie 30

Dateizugriffe (4) // umask-test.c #include <stdlib.h> int main () { creat ("test1.rwx", 0777); // max. Rechte: rwxrwxrwx creat ("test1.-wx", 0333); // Rechte: -wx-wx-wx creat ("test1.r-x", 0555); // Rechte: r-xr-xr-x umask (0); creat ("test2.rwx", 0777); // max. Rechte: rwxrwxrwx creat ("test2.-wx", 0333); // Rechte: -wx-wx-wx creat ("test2.r-x", 0555); // Rechte: r-xr-xr-x system ("stat -c '%a %A %n' test?.???"); }; root@ubu64:~# umask 0022 root@ubu64:~#./umask-test 755 -rwxr-xr-x test1.rwx 555 -r-xr-xr-x test1.r-x 311 --wx--x--x test1.-wx 777 -rwxrwxrwx test2.rwx 555 -r-xr-xr-x test2.r-x 333 --wx-wx-wx test2.-wx Folie 31

Dateizugriffe (5) Lesen: read() read (fd, &buffer, count); (liest count Bytes aus der Datei und schreibt sie in den Puffer; Rückgabewert: Anzahl der gelesenen Bytes) Schreiben: write() write (fd, &buffer, count); (schreibt count Bytes aus dem Puffer in die Datei; Rückgabewert: Anzahl der geschriebenen Bytes) Folie 32

Dateizugriffe (6) Datei schließen: close() close (fd); Folie 33

Fehlerbehandlung (1) System Calls können fehlschlagen immer den Rückgabewert des Syscalls überprüfen Manpages erklären, woran man Fehler erkennt Beispiele: fork(): Prozess kann nicht erzeugt werden, Rückgabewert -1 open(): Datei kann nicht geöffnet werden, Rückgabewert -1, genauere Fehlerbeschreibung in Variable errno Folie 34

Fehlerbehandlung (2) Variable errno: #include <errno.h> Standard-Fehler-Codes in /usr/include/asm-generic/errno-base.h Für Anzeige des Fehlers gibt es Funktion perror(). Beispiel: Datei öffnen Folie 35

Fehlerbehandlung (3) /* open1.c, Hans-Georg Esser, Systemprogrammierung */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> int main () { int fd = open ("/etc/dontexist", O_RDONLY); if (fd == -1) { // Fehler int err = errno; printf ("Fehler bei open(), errno = %d, ", err); switch (errno) { case ENOENT: printf ("No such file or directory\n"); break; case EACCES: printf ("Permission denied\n"); break; default: printf ("\n"); }; } exit (-1); // Programm mit Fehlercode verlassen close (fd); }; Folie 36

Fehlerbehandlung (4) mit perror(): /* open2.c, Hans-Georg Esser, Systemprogrammierung */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <stdlib.h> int main () { int fd = open ("/etc/dontexist", O_RDONLY); if (fd == -1) { // Fehler perror ("open2"); exit (-1); // Programm mit Fehlercode verlassen } close (fd); }; Folie 37

Fehlerbehandlung (5) Ausgabe open1.c: $./open1 Fehler bei open(), errno = 2, No such file or directory Ausgabe open2.c: $./open2 open2: No such file or directory Folie 38