|
![ein Kapitel weiter](../weiter.gif)
sysopen :
sysopen und open unterscheiden sich Hauptsächlich dadurch das
mit sysopen die Zugriffsrechte und der Öffnungsmodus genau
festgelegt werden können. Hier ein Beispiel zu sysopen.......
#!/usr/bin/perl -w
use Fcntl;
sysopen(FH, "./Neuedatei.txt", O_WRONLY|O_CREAT, 0600) or die $!;
print FH "Dieser Text wird in Neuedatei.txt geschrieben\n";
close(FH);
Anhand diese Beispiels können sie erkennen das die Unterschiede zu
open nicht all zugroß sind. Der Filehandle ist der selbe.
Bei der Dateiangabe benötigen sie nicht mehr die Zeichen <,>,+< usw.
da wir dies mit unseren O_*-Konstanten machen. Hier erzeugen wir eine
Datei (O_CREAT) ausschießlich zum Schreiben (O_WRONLY) mit den Zugriffsrechten
0600. Also nur für den Eigentümer. Also nochmals der Syntax zu sysopen.....
sysopen(Filehandle,Dateiname,Öffnungsmodus,Zugriffsrechte);
Weitere Zugriffsarten zu sysopen lauten.....
Modus |
Bedeutung |
O_RDONLY |
nur zum lesen öffnen (O_RDONLY=0) |
O_WRONLY |
nur zum schreiben öffnen (O_WRONLY=1) |
O_RDWR |
zum lesen und schreiben öffnen (O_RDWR=3) |
O_CREAT |
Falls Datei nicht existiert wird sie neu
angelegt. Falls die Datei existiert wird ist O_CREAT ohne Wirkung. |
O_APPEND |
Datei zu Schreiben am Ende
"Anhängen". |
O_EXCL |
O_EXCL kombiniert mit O_CREAT bedeutet das
die Datei nicht geöffnet werden kann wenn sie bereits existiert und
open den Wert -1 zurückliefert. (-1 == Fehler) |
O_TRUNC |
Eine Datei die zum Schreiben geöffnet wird
wird geleert. Das Nachfolgende Schreiben bewirkt erneutes Beschreiben
der Datei von Anfang an. Die Attribute der Datei bleiben erhalten. |
O_NOCTTY |
Falls der Pfadname der Name eines Terminal
ist, so sollte dies nicht der Kontrollterminal des Prozesses werden. |
O_NONBLOCK |
Falls der Pfadname der Name einer FIFO oder
Gerätedatei ist, wird diese beim Öffnen und bei nachfolgenden I/O-
Operationen nicht blockiert. |
O_SYNC |
Nach dem Schreiben mit write warten, daß
der Schreibvorgang vollständig abgeschlossen ist. |
sysread :
Mit der Funktion sysread können sie von einem Filehandle einlesen.
Außerdem liest sysread die Daten Ungepuffert ein. Wollen wir uns
dazu ein Beispiel ansehen............
#!/usr/bin/perl -w
use Fcntl;
sysopen(FH, "./Neuedatei.txt", O_RDONLY) or die $!;
$bytes=sysread(FH, $buffer,50);
print $buffer , "\n" if $bytes == 50;
close(FH);
Nun zur Erklärung von.......
$bytes=sysread(FH, $buffer,50);
Wir lesen von der Datei mit dem Filehandle FH 50 Bytes in den Puffer
$buffer ein. Den Rückgabewert überprüfen wir ebenso, ob auch wirklich
50 Zeichen an $buffer übergeben wurden.
Der Vorteil liegt auch hier wieder ganz klar bei der Performance.
sysread ist bei größeren Datenmengen schneller als zum Beispiel
read oder alle anderen gepufferten Einlesearten.
syswrite :
Das Gegenstück zu sysread ist syswrite. Auch hiermit können wir
wieder ungepuffert in eine Datei schreiben. Die Anwendung von
syswrite ist die selbe wie von sysread........
#!/usr/bin/perl -w
use Fcntl;
sysopen(FH, "./Neuedatei.txt", O_RDONLY) or die $!;
sysopen(BAK,"./backup.bak", O_WRONLY|O_CREAT, 0600) or die $!;
$bytes_rd=sysread(FH, $buffer,50);
$bytes_wr=syswrite(BAK, $buffer,50) if $bytes_rd == 50;
print "Fehler beim Schreiben in backup.bak\n" if $bytes_wr != 50;
close(FH);
close(BAK);
Hier legen wir ein Kopie von Neuedatei.txt an, die wir zuvor mit
sysread auslesen. Anschließend schreiben wir die in $buffer ausgelesenen
Zeichen in den Filehandle BAK (wieder 50 Bytes).
Sie sollten bei den sys...-Aufrufen jedoch beachten das sie diese nicht mit
Funktionen der stdio-Bibliothek vermischen, wegen der Unterschiedlichen
Pufferung. Mit Nicht-Vermischen sind die Funktionen sysread, syswrite, systell,
sysseek gemeint. Diese sollten nicht mit read, seek, tell....usw. verwendet werden.
![ein Kapitel weiter](../weiter.gif)
© 2001,2002 Jürgen Wolf
|