ein Kapitel zurück                                           ein Kapitel weiter

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 zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf