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