Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7486[/thread]

DIR bzw. FILE sperren?: flock(...);



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
BratHering
 2005-11-21 19:58
#60284 #60284
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hi!

Mein Skript öffnet mit opendir() ein Verzeichnisse um den Inhalt dessen auszulesen.

Gibt es eine Methode um das geöffnete Verzeichnis zu sperren, damit zu dem Zeitpunkt keine Daten dazu kommen bzw. gelöscht werden können?

Ich weiss, dass flock() Dateien sperren kann, aber geht das auch mit Verzeichnissen? Wenn ja, wie?

Ebenfalls habe ich bereits die PerlDoc zu flock() gelesen aber für mich ist das ganze etwas zu fachspezifisch was diese FLAGS angeht; wann braucht man welchen von diesen (LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB)?



MfG
BratHering
pq
 2005-11-21 20:20
#60285 #60285
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
du könntest ein lockfile im betreffenden verzeichnis locken. verzeichnisse locken geht
glaube ich nicht...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
BratHering
 2005-11-21 20:24
#60286 #60286
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Also d.h. wenn ich eine datei locke, dann ist das Verzeichnis auch gelockt?

Und noch ne frage: Dateien öffne ich einmal zum Lesen und einmal zum Schreiben, welches dieser Flags hat welche Bedeutung dazu (LOCK_SH, LOCK_EX, LOCK_UN, LOCK_NB)?\n\n

<!--EDIT|BratHering|1132597489-->
GwenDragon
 2005-11-21 20:50
#60287 #60287
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Nein, das Verzeichnis ist nicht gelockt.

Schau bitte einmal in die Perldoku perldoc perlopentut unter file locking.\n\n

<!--EDIT|GwenDragon|1132599476-->
tomlong
 2005-11-21 21:13
#60288 #60288
User since
2003-08-04
93 Artikel
BenutzerIn
[default_avatar]
wenn du das locking nicht unbedingt auf system-ebene brauchst dann erstell dir doch einfach ein semaphorfile und schau nach ob es existiert bevor du irgendwelche änderungen vom script aus zulässt.
Live long and prosper!
42;
pq
 2005-11-21 21:59
#60289 #60289
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=BratHering,21.11.2005, 19:24]Und noch ne frage: Dateien öffne ich einmal zum Lesen und einmal zum Schreiben[/quote]
dann kannst du dir vermutlich das gesamte locking sparen, weil dir zwischendurch jeder reinpfuschen kann.
lies mal den wikieintrag Wiki:Wie spere ich eine Datei?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
BratHering
 2005-11-22 00:34
#60290 #60290
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Okay, vielen dank für die Info. Inzwischen habe ich das hier heraus gegoogled: http://groups.google.de/group....9b77713
...und scheinbar kann man wirklich keine DirHandles sperren.

Aber wenn man eine Datei sperrt, dann kann man doch das Verzeichnis selber nicht löschen in dem die Datei liegt, solange diese gesperrt ist, oder?
ptk
 2005-11-22 00:43
#60291 #60291
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bei Unix ist es so, dass eine Datei unwiderruflich verschwindet, wenn der letzte Link auf sie verschwindet. Solange du dann noch einen FileHandle offen hast, existiert die Datei (irgendwie), aber mit dem close() ist sie weg.

Kleine Demonstration:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
open(X, ">/tmp/bla") or die $!;
print X "hallo";
close X;

# Datei /tmp/bla existiert
system("ls -al /tmp/bla");

open(X, "</tmp/bla") or die $!;
unlink "/tmp/bla"; # letzter Link auf der Festplatte ist weg, aber der Filehandle ist noch da

system("ls -al /tmp/bla"); # findet /tmp/bla bereits nicht

# funktioniert
while(<X>) {
    print STDERR $_, "\n";
}
# funktioniert auch
seek X, 0, 0;
while(<X>) {
    print STDERR $_, "\n";
}
close X; # jetzt ist sie wirklich weg
esskar
 2005-11-22 03:11
#60292 #60292
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
funzt aber (leider) wirklich nur unter unix und co.
pKai
 2005-11-22 11:32
#60293 #60293
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Win32 z. B. weigert sich die offene Datei zu löschen
Code: (dl )
unlink "/tmp/bla" or warn $!;
Quote
Permission denied at D:\temp\fweg.pl line 10.
I sense a soul in search of answers.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2005-11-21 19:58.