Schrift
[thread]9968[/thread]

"open() und sysopen()" /? (Seite 2)



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
sid burn
 2007-08-05 03:03
#97534 #97534
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
topeg+2007-08-05 00:01:22--
Es gibt die vordefinierte Variable "$|", die sämtliche Puffer für alle geöffneten Filehandles (Ein/Ausgabestreams) abschaltet.

Nein, das ist Falsch!!!

Wenn du $| auf True setzt, dann wird nur der aktuelle Aktive Filehandle ungebuffert gesetzt, und nicht sämtliche Buffer. Weiterhin wird mit $| nur die Ausgabe auf ungepuffert gesetzt, und nicht die Eingabe!

Wenn du die eingabe ungepuffert haben möchtest, musst du meistens spezielle ungepufferte Funktionen nutzen. Zum Beispiel mit "sysread()" von einem Filehandle lesen, anstatt "<$fh>" etc.

Wenn du z.B. einem Filehandle auf ungebuffert setzen möchtest, dann musst du zuerst mit select() den Filehandle setzen, die rückgabe Speichern, $| auf true setzen. Und wieder zurück zum alten Filehandle wechseln. z.B. so:

Code (perl): (dl )
1
2
3
my $oldfh = select( $filehandle );
$| = 1;
select( $oldfh );


das ist ziemlich unpraktisch. Daher empfehle ich IO::Handle. Das hat eine Methode um ein spezielles Filehandle auf unbuffered zu stellen. und das select() gedönse da oben fällt weg.

Code (perl): (dl )
1
2
3
4
5
use IO::Handle;

my $fh, '>', $filename  or  die $!;
$fh->autoflush( 1 );
....
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
BlackExe
 2007-08-05 04:17
#97536 #97536
User since
2007-03-25
49 Artikel
BenutzerIn
[default_avatar]
Hallo sid burn ... :_))


Jetzt weiss ich nicht wie ich mich bei Dir bedanken soll?
Also Du hast mir mit Deinen Beiträgen, echt weitergeholfen.
Super das Du auch den Sicherheitspunkt erklärt hast.
Ich habe das jetzt schon soweit super verstanden ... :_))

Ich versuche immer an Erster stelle die Sicherheit zu beachten aber
Informationen darüber dind echt schwer zufinden, für mich jedenfalls.


Also sid burn, hab Herzlichen Dank dafür das Du dir die Zeit genommen hast.




Gruß Steve
Glaube denen, die die Wahrheit suchen, und zweifle an denen, die sie gefunden haben.
sid burn
 2007-08-05 05:09
#97537 #97537
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Hier ist ein "Sicheres Programmieren" Artikel aus dem Linux Magazin. Das Thema behandelt sogar open() und sysopen() sollte allerdiengs die schwachpunkte vllt etwas besser erklären können. Da dies ein Live Beispiel ist. Den der Daemon ridentd (in Perl geschrieben) hatte diese Sicherheitslücken, und wurde zusammen mit dem Linux Magazin behoben.

http://www.linux-magazin.de/heft_abo/ausgaben/2006...
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
RalphFFM
 2007-08-05 13:30
#97547 #97547
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Gast+2007-08-05 00:45:37--
Und öffnen + locking kann auch bei sysopen() nicht in einen Schritt gemacht werden.


Nur wie ist dann der zweite Hälfte vom Abschnitt
http://faq.perl.org/perlfaq5.html#Why_can_t_I_just...
zu verstehen?

Und unter
http://www.thomas-fahle.de/pub/perl/Diverses/Open_...
schreibt Thomas Fahle:
"Die einzige sichere Methode zum Öffnen von Dateien ist sysopen()."
Ist das dann falsch?
murphy
 2007-08-05 17:37
#97556 #97556
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Zwei Sachen, die ich für falsch dargestellt halte, sind mir in diesem Thread aufgefallen:

1) $| schaltet nicht die Pufferung der Ausgabe ab, sondern aktiviert den Autoflushmodus für das aktuell ausgewählte Dateihandle. Das hat zwar einen ähnlichen Effekt, nämlich dass nach jeder Schreiboperation sofort die Puffer geleert werden, ist aber nicht dasselbe.

2) Man kann mit sysopen auch gleich eine Lockingoperation durchführen, allerdings ist dafür in der Tat nicht das Flag O_EXCL zuständig, sondern es sind vielmehr die Flags O_SHLOCK und O_EXLOCK.
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2007-08-05 00:48.