7.1
Transcription
7.1
7 Ein/Ausgabe bs-7.1 1 Zur Erinnerung: Moderne Betriebssysteme verbergen die Spezifika der verschiedenen E/A-Geräte hinter der Systemschnittstelle – so gut es geht. Beispiel Unix: was steckt hinter einem Kanal ? Ein Programm weiß i.d.R. nicht, ob mit read(0,buffer,n) von der Tastatur, aus einer Datei, aus dem Netz, aus einer Pipe, aus ..... bs-7.1 gelesen wird 2 fstat(channel,&status) liefert in status erschöpfende Information darüber, was hinter channel steckt: mode_t ino_t dev_t st_mode; st_ino; st_dev; dev_t st_rdev; nlink_t uid_t gid_t off_t time_t time_t time_t st_nlink; st_uid; st_gid; st_size; st_atime; st_mtime; st_ctime; long st_blksize; blkcnt_t st_blocks; /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* File mode (see mknod(2)) */ (7.1) Inode number */ ID of device containing */ a directory entry for this file */ ID of device */ This entry is defined only for */ char special or block special files */ Number of links */ User ID of the file's owner */ Group ID of the file's group */ File size in bytes */ Time of last access */ Time of last data modification */ Time of last file status change */ Times measured in seconds since */ 00:00:00 UTC, Jan. 1, 1970 */ Preferred I/O block size */ Number of 512 byte blocks allocated*/ Grobe Klassifizierung von E/A-Geräten – 2 Klassen: blockorientiert (block I/O): - Platten - CD-ROM - Magnetband ... weitere externe Speichermedien zeichenorientiert (character I/O): - Tastatur - Maus - Drucker - Plotter bs-7.1 ... weitere eigentliche E/A-Geräte 4 7.1 Explizite Gerätebenutzung Pionierleistung von Unix: Geräte werden als Gerätedateien (special files) eingeführt, die Gerätebeschreibungen enthalten, (block special files und character special files); open erzeugt Kanal zwischen Prozess und Gerät. Beispiel: nach fd = open("/dev/lp",O_WRONLY) drucken mit $ ls -l /dev crw------1 lohr brw-r----1 root ..... bs-7.1 lohr operator write(fd,"hello",5) 0, 14, 0 Jan 0 Jan 7 16:34 console 6 17:20 disk0 5 Typische Namenskonvention für Gerätedateien: /dev/... : /dev/dsk0 dsk1 dsk2 .... Platte, genauer „logische Platte“ = zusammenhängender Bereich auf realer Platte (partition) /dev/lp Drucker, falls nur einer (sonst lp0,lp1,.. ) /dev/tty0 tty1 .... Datenstationen (Terminals), Modems bs-7.1 tty steht abkürzend für teletype = Fernschreiber (vor dem Aufkommen von Bildschirmen benutzt). 6 /dev/tty Pseudo-Gerätedatei: control terminal des aktuellen Prozesses (wird beim Einloggen festgelegt und bei fork vererbt; identisch für alle Prozesse einer Prozessgruppe) /dev/null Pseudo-Gerätedatei: Abfalleimer /dev/mem bs-7.1 Pseudo-Gerätedatei: BS-Daten (read-only) Nicht für Netzanschlüsse! (7.4) 7 Einrichtung von Gerätedateien gemäß der realen Peripherie: mknod(path,mode,dev) erzeugt Gerätedatei mit Namen path, und Gerätebeschreibung dev; mode bestimmt u.a. den Schutzstatus, aber auch - block special file oder - character special file (oder - Verzeichnis, normale Datei, benannte Pipe). dev hat 2 Komponenten: bs-7.1 major device number Geräteart ( Treiber) minor device number Gerätenummer 8 mode (Dateityp): S_IFMT 170000 Type of file S_IFIFO S_IFCHR S_IFDIR S_IFBLK S_IFREG S_IFLNK 10000 20000 40000 60000 100000 120000 Named pipe Character special Directory Block special Regular Symbolic link 007777 Protection and locking ... bs-7.1 9 mode (Schutz und Sperren): 007777 S_ISUID S_ISGID 04000 020#0 S_ISVTX 01000 S_IRWXU S_IRUSR S_IWUSR S_IXUSR 00700 00400 00200 00100 S_IRWXG S_IRGRP S_IWGRP S_IXGRP 00070 00040 00020 00010 Protection and locking ... Set user ID on execution. Set group ID on execution if # is 7, 5, 3, or 1. Enable mandatory file/record locking if # is 6, 4, 2, or 0 On directories, restricted deletion flag; on regular files on a UFS file system, do not cache flag. Read, write, execute by owner. Read by owner. Write by owner. Execute (search if a directory) by owner. Read, write, execute by group. Read by group. Write by group. Execute by group. 10 Achtung: mknod kann nur vom Super-User ausgeführt werden (EUID = 0) mknod sollte den Schutzstatus i.d.R. so setzen, dass Normalsterblichen kein Zugriff gewährt wird – abgesehen von Ausnahmen wie z.B. /dev/tty , /dev/null , /dev/mem Systemprozess darf aber zugreifen, z.B. Drucker-Spooler beginnt seine Tätigkeit mit fd = open("/dev/lp",O_WRONLY) bs-7.1 11 Gerätespezifische Steuerungsfunktionen: ioctl(channel,command,arg) übermittelt dem Treiber hinter channel (falls vorhanden) einen Befehl command mit Parametern arg, z.B. (Bandlaufwerk:) Band zurückspulen (Datenübertragung:) Geschwindigkeit einstellen (Tastatur:) Modus u.a. setzen (7.2.1) ..... etc. etc. Bemerkung: Dieser Systemaufruf ist nicht privilegiert – wer im Besitz des channel ist, darf ihn benutzen. bs-7.1 12