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

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

U5 Verzeichnisse und Sortieren

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Sommersemester 2018

Inhalt. Übungen zu Systemnahe Programmierung in C (SPiC) Dateikanäle. Inhalt. Dateien & Dateikanäle Dateikanäle Ein-/Ausgaben

U6 Verzeichnisse und Sortieren

Übungen zu Systemnahe Programmierung in C (SPiC) Wintersemester 2017/18

U6-1 Linux-Benutzerumgebung

Übungen zu Systemnahe Programmierung in C (SPiC)

Übungen zu Systemnahe Programmierung in C (SPiC) Inhalt. Moritz Strübe, Rainer Müller (Lehrstuhl Informatik 4) Sommersemester 2013

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

Linux Prinzipien und Programmierung

Fortgeschrittene I/O

U6 Verzeichnisse und Sortieren U6 Verzeichnisse und Sortieren

a.h a.c #include "a.h" #include "b.h" int a; int b; static int d; b.c #include "a.h" #include "b.h" b.h #ifnedef B_H #define B_H #include "a.

Hans-Georg Eßer, FH München Betriebssysteme I, WS 2006/07, 2007/01/24 Zusammenfassung (2/2) Folie 2

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

Programmiertechnik 1. Unit 12: Programmiersprache C - Betriebssystemschnittstellen. Andreas Polze 1

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

Wie man das Dateisystem in Deutschland versteht

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

U6-1 Linux-Benutzerumgebung

E.1 Allgemeine Konzepte (3) E.1 Allgemeine Konzepte (2) E.1 Allgemeine Konzepte. Datei. Einordnung. Katalog / Verzeichnis

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

4.3 Directories / Filesysteme

Betriebssystem-Entwicklung mit Literate Programming

Dateisystem. Heimo Schön 4/2002 Seite 1/31

18.1 Überblick Überblick (3)

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

Tafelübung zu BS 5. Dateioperationen

Vorlesung Betriebssysteme 2. Dateisysteme I (Benutzer-Sicht) Peter Altenbernd Dateisysteme I Betriebssysteme WS 2010/11 Hochschule Darmstadt

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

Überblick: Teil D Betriebssystemabstraktionen

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

Basiskonzepte des Rechnerbetriebs

Die mit Solaris ausgelieferte C-Bibliothek zeigt dieses Problem nicht SP - Ü

Tafelübung zu BS 4. Dateioperationen

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Linux. Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm. FB Automatisierung und Informatik.

Linux. Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm. Hochschule Harz. FB Automatisierung und Informatik.

2 2. Tag. 2.1 Das Dateisystem. das Dateisystem organisiert die Speicherung von Daten. viele Betriebssysteme haben verschiedene Dateisysteme

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

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

Betriebssysteme. Tafelübung 5. Dateioperationen. Daniel Friesel.

9. Dateisysteme. Betriebssysteme Harald Kosch Seite 164

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

Einführung in die Programmiersprache C

Arbeiten mit der Shell Teil 1

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

5. Dateioperationen. Tafelübung zu BSRvS1. Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Übung aus Systemprogrammierung & Systemnaher Programmierung

Technische Praxis der Computersysteme

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

I Dateisysteme. I.1 Allgemeine Konzepte. Einordnung. Prozessor (CPU, Central processing unit) Ein-, Ausgabegeräte/ Periphere Geräte (I/O Devices)

Übungen zur Systemprogrammierung 1 Michael Golm, Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4,

Prozesse, Logs und Systemverwaltung

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

Prozesse, Logs und Systemverwaltung

Linux eine Einführung

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

Zugriffsrechte. anzeigen lassen mit dem Befehl: ls -l

Unix/Linux Grundlagen für Einsteiger

Hintergrundspeicher (Secondary storage) Katalog. SPiC

UNIX-Dateisysteme - Allgemeines

Benutzer und Rechte Teil 3

Arbeiten mit der Shell Teil 1

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Arbeiten mit der Shell Teil 1

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Betriebssysteme Praxis

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

Technische Praxis der Computersysteme. Technische Praxis der Computersysteme

Literatur. Einführung in Unix. Login. Passwort. Mag. Thomas Griesmayer. Benutzererkennung und Passwort Case-Sensitiv Prompt

Gibt Daten im erweiterten Format aus. Dies beinhaltet die Angabe von Zugriffsrechten, Besitzer, Länge, Zeitpunkt der letzten Änderung und mehr.

Systemsoftware I. Dominanz der Dateisysteme. 8. Dateisysteme. Systemsoftware. Seite 8.1. (c) 2002, Prof. Dr. P. Sturm, Universität Trier

Einschub: HW-Zugriff aus dem Userspace

Aufbau eines Kernelmoduls

Die Shell - Das Vorspiel

Operating Systems Principles. Event Queue

Beispiel / Übung: Prof. Dr. A. Christidis WS 2012/13

Linux I II III Res WN/TT NLTK XML Weka E Rechte Encoding. Linux III. 3 Linux III. Rechte Encoding. Ressourcen-Vorkurs

cat more less tail head

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Benutzer- und Rechte-Verwaltung Teil 2

Linux I II III Res WN/TT Rechte Encoding. Linux III. 3 Linux III. Rechte Encoding. Ressourcen-Vorkurs

Implementierung eines Dateisystems für den transparenten Zugriff auf ein Versionskontrollsystem

G 5. Übung. G-1 Überblick. Besprechung 3. Aufgabe. Infos zur Aufgabe 5: fork, exec. Rechenzeiterfassung. Ü SoS I G.1

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

Was machen wir heute? Betriebssysteme Tutorium 10. Frage 10.1.a. Frage 10.1.a

Benutzung wichtiger Konsolenbefehle auf dem Raspberry Pi und anderen Linux Systemen

Arbeiten mit der Shell Teil 1

Benutzer- und Rechtevergabe

1 Einleitung UNIX und seine Philosophie 13

Einteilung von Dateien. Streams

Kap. 8: Dateisysteme (E3 EXT2 Dateisystem) 1

Die UNIX-Kommandozeile

Arbeiten mit der Shell Teil 5

Benutzer- und Rechte-Verwaltung Teil 2

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]: 5. Accepted Dateien rsa for esser from ::ffff:87.234.201.207 port 63546 und 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]: Accepted rsa for esser from ::ffff:87.234.201.207 port 63397 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]: Verzeichnisse (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

Dateien und Verzeichnisse Schon gesehen: Datei öffnen (open, File Descriptor) Datei erzeugen (creat) Lesen, schreiben (read, write) Datei schließen (close) Flags fürs Öffnen (O_RDONLY etc.) Modus beim Erzeugen (S_IRUSR etc.) Folie 2

C-Funktionen zu Dateien / Verz. Positionierung innerhalb Datei: lseek() Datei-Informationen: stat(), lstat() Links: link(), symlink() Datei löschen: unlink() Besitzer, Gruppe, Rechte: (f)chown(), (f)chmod() Verzeichnisse: getcwd(), (f)chdir(), mkdir(), rmdir() Verzeichnisinhalte verarbeiten Folie 3

lseek() Bisher: Dateien sequenziell lesen oder schreiben lseek() erlaubt Positionierung des Schreib-/Lese-Zeigers drei Varianten: lseek (fd, offset, SEEK_SET): absolut lseek (fd, offset, SEEK_CUR): relativ lseek (fd, offset, SEEK_END): Dateiende + offset (meist: offset = 0) Rückgabewert: neuer Offset Folie 4

Anhängen an Datei (1) zwei Möglichkeiten: Variante 1 Datei normal zum Schreiben öffnen Sprung ans Dateiende mit lseek() schreiben Variante 2 Datei im Append-Modus (O_APPEND) öffnen schreiben Folie 5

Anhängen an Datei (2) Vorteil der Append-Variante: Wenn mehrere Prozesse dieselbe Datei zum Schreiben verwenden, führen alle write()- Aufrufe garantiert zum Anhängen bei normalem Öffnen ggf. gegenseitiges Überschreiben möglich Typische Anwendung: Schreiben in Log-Datei Folie 6

Datei-Informationen: stat() Eigenschaften einer Datei in Datenstruktur vom Typ struct stat Aufruf: struct stat s; stat (dateiname, &s); struct stat s; lstat (dateiname, &s); Wenn Datei ein Symlink ist, gibt stat() Informationen über verlinkte Datei aus; bei lstat() ist es der Link selbst Folie 7

Aufbau von struct stat 43: struct stat 44: { 45: dev_t st_dev; /* Device. */ 50: ino_t st_ino; /* File serial number. */ 58: nlink_t st_nlink; /* Link count. */ 59: mode_t st_mode; /* File mode. */ 61: uid_t st_uid; /* User ID of the file's owner. */ 62: gid_t st_gid; /* Group ID of the file's group.*/ 66: dev_t st_rdev; /* Device number, if device. */ 71: off_t st_size; /* Size of file, in bytes. */ 75: blksize_t st_blksize; /* Optimal block size for I/O. */ 77: blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ 95: time_t st_atime; /* Time of last access. */ 97: time_t st_mtime; /* Time of last modification. */ 99: time_t st_ctime; /* Time of last status change. */ 112: }; Quelle: /usr/include/sys/stat.h, nur Teile dargestellt time_t: long int, Sekunden seit 01.01.1970 00:00 Uhr ls -l zeigt st_mtime an Folie 8

st_mode in struct stat (1) st_mode schlecht lesbar (am besten oktal ausgeben): // stattest.c #include <sys/stat.h> #include <stdio.h> main () { struct stat s; lstat ("/etc/fstab", &s); printf ("s.st_mode: o%o\n", s.st_mode); } root@ubu64:~#./stattest s.st_mode: o100644 root@ubu64:~# ls -l /etc/fstab -rw-r--r-- 1 root root 681 2012-04-18 13:58 /etc/fstab klar: 644 = Zugriffsrechte; Rest: Manpage Folie 9

st_mode in struct stat (2) S_IFMT 0170000 bit mask for the file type bit fields S_IFSOCK 0140000 socket S_IFLNK 0120000 symbolic link S_IFREG 0100000 regular file S_IFBLK 0060000 block device S_IFDIR 0040000 directory S_IFCHR 0020000 character device S_IFIFO 0010000 FIFO S_ISUID 0004000 set UID bit S_ISGID 0002000 set-group-id bit (see below) S_ISVTX 0001000 sticky bit (see below) S_IRWXU 00700 mask for file owner permissions S_IRUSR 00400 owner has read permission S_IWUSR 00200 owner has write permission S_IXUSR 00100 owner has execute permission S_IRWXG 00070 mask for group permissions S_IRGRP 00040 group has read permission S_IWGRP 00020 group has write permission S_IXGRP 00010 group has execute permission S_IRWXO 00007 mask for permissions for others (not in group) S_IROTH 00004 others have read permission S_IWOTH 00002 others have write permission S_IXOTH 00001 others have execute permission Folie 10

st_mode in struct stat (3) Makro-Definitionen zum Testen (aus stat.h): #define S_IFMT 00170000 #define S_IFSOCK 0140000 #define S_IFLNK 0120000 #define S_IFREG 0100000 #define S_IFBLK 0060000 #define S_IFDIR 0040000 #define S_IFCHR 0020000 #define S_IFIFO 0010000 #define S_ISUID 0004000 #define S_ISGID 0002000 #define S_ISVTX 0001000 #define S_ISLNK(m) #define S_ISREG(m) #define S_ISDIR(m) #define S_ISCHR(m) #define S_ISBLK(m) #define S_ISFIFO(m) #define S_ISSOCK(m) (((m) & S_IFMT) == S_IFLNK) (((m) & S_IFMT) == S_IFREG) (((m) & S_IFMT) == S_IFDIR) (((m) & S_IFMT) == S_IFCHR) (((m) & S_IFMT) == S_IFBLK) (((m) & S_IFMT) == S_IFIFO) (((m) & S_IFMT) == S_IFSOCK) Folie 11

Fehler bei stat() stat()-aufruf kann fehlschlagen: // rekstat.c #include <sys/stat.h> #include <stdio.h> main () { struct stat s; int res = stat ("rekursiv", &s); if (res == -1) { perror("rekstat"); exit(0); } } root@ubu64:~# ln -s rekursiv rekursiv root@ubu64:~#./rekstat rekstat: Too many levels of symbolic links root@ubu64:~# file rekursiv rekursiv: symbolic link in a loop Folie 12

Status geöffneter Dateien Alternative fstat() verwendet file descriptor (einer geöffneten Datei) int fd = open (...); struct stat s; fstat (fd, &s); Folie 13

Symlink erzeugen Symlink (symbolischer Link, Soft Link) ist Verweis durch Pfadangabe symlink (original, link) erzeugt Datei vom Typ link (l) Pfad relativ oder absolut dateisystem-übergreifend möglich Folie 14

Hardlink erzeugen Hardlink (Link) ist weiterer Verzeichniseintrag zu bestehender Datei; gleicher Inode (Verzeichnis = Tabelle mit Dateiname/Inode-Nr.-Paaren) link (original, link) original muss existieren, link muss im selben Dateisystem wie original liegen überschreibt keine vorhandenen Dateien Folie 15

Datei löschen: unlink() unlink (filename) löscht eine Zuordnung Dateiname/Inode-Nr. aus Verzeichnis, reduziert Link Count nicht identisch mit Datei löschen, falls Link Count vor unlink() größer als 1 war Datei bleibt auch bei Link Count 0 noch erhalten, solange sie noch geöffnet ist Folie 16

Besitzer, Gruppe: (f)chown() chown (dateiname, owner, group) lchown (dateiname, owner, group) (folgt Symlinks nicht) fchown (fd, owner, group) (mit file descriptor fd, offene Datei) numerische IDs für owner und group einer der Werte darf 1 sein ( nicht ändern) keine separate chgrp()-funktion Folie 17

Zugriffsrechte: (f)chmod() chmod (datei, mode) lchmod (datei, m) (folgt Symlinks nicht) fchmod (fd, mode) (mit file descriptor fd) mode: S_ISUID (04000) set-user-id S_ISGID (02000) set-group-id S_ISVTX (01000) sticky bit (restricted deletion flag) S_IRUSR (00400) read by owner S_IWUSR (00200) write by owner S_IXUSR (00100) execute/search by owner ("search" applies for directories, and means that entries within the directory can be accessed) S_IRGRP (00040) read by group S_IWGRP (00020) write by group S_IXGRP (00010) execute/search by group S_IROTH (00004) read by others S_IWOTH (00002) write by others S_IXOTH (00001) execute/search by others Folie 18

Arbeitsverzeichnis: getcwd() aktuelles Arbeitsverzeichnis abfragen char pfad[100]; getcwd (&pfad, sizeof(pfad)); Alternative: getwd (&pfad) (unsicher) Alternative unter Linux: char *get_current_dir_name(void); (reserviert mit malloc() freien Speicher für den Pfad, anschließend mit free() freigeben) Folie 19

Arbeitsverzeichnis: chdir() Aktuelles Arbeitsverzeichnis ändern: chdir (pfad) oder: fchdir (fd) mit offenem file descriptor fd Folie 20

Verzeichnis erzeugen: mkdir() mkdir (pfad, mode) mode: Bedeutung wie bei chmod() mode wird durch umask verändert, tatsächlicher Wert: mode & ~umask & 0777 vgl. umask bei creat() es ist nicht möglich, mehrere Verzeichnisse in einem Rutsch zu erzeugen (vgl. Shell-Befehl mkdir -p a/b/c) Folie 21

Verzeichnis löschen: rmdir() rmdir (pfad) löscht leeres Verzeichnis es ist nicht möglich, mehrere Verzeichnisse in einem Rutsch zu erzeugen (vgl. Shell-Befehl rmdir -p a/b/c) Folie 22

Verzeichnisliste (1) Die bisher vorgestellten Kommandos entsprechen direkt (meist) gleichnamigen System Calls Für das Auslesen eines Verzeichnisses gibt es den Syscall getdents (get directory entries), der nicht direkt benutzt wird Wrapper: readdir() Doku: man 3 readdir (nicht die Manpage aus Abschnitt 2!) Folie 23

Verzeichnisliste (2) Aufrufe von readdir() geben immer Zeiger auf einen struct dirent zurück: 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; /* type of file; not supported by all file system types */ char d_name[256]; /* filename */ }; für Namensliste: nur d_name auswerten Folie 24

Verzeichnisliste (3) // readdir.c #include <dirent.h> #include <errno.h> #include <stdio.h> int main (int argv, char *argc[]) { DIR *dirp; struct dirent *entry; root@ubu64:~#./readdir. uebung04 (103804) stat.c (100534). (38091).. (435) readdir.c (100533) a.out (100539) if (argv!= 2) { printf ("readdir Verzeichnis\n"); return 0; }; if ((dirp = opendir(argc[1])) == NULL) { perror(""); return -1; }; do { if ((entry = readdir(dirp))!= NULL) { printf("%s (%d)\n", entry->d_name, (int)entry->d_ino); } } while (entry!= NULL); } closedir(dirp); return 0; Folie 25

Übersicht Shell / C Shell-Kommandos C-Funktionen umask > umask() creat() >> open (..., O_APPEND) stat ln stat() link() ln -s symlink() rm chown u:g file unlink() chown(file,u,g) chown u f chgrp g f chown(f,u,-1) chown(f,-1,g) chown -h lchown() chgrp -h chmod lchown() chmod() pwd getcwd() cd mkdir chdir() mkdir() rmdir rmdir() ls opendir(), readdir(), stat() Folie 26