hallo,
Hier der auschnitt aus meiner doku zu DB_File:
Concurrent access of a read-write database by several parties requires them all to use some kind of locking. Here's an example of Tom's that uses the fd method to get the file descriptor, and then a careful open() to give something Perl will flock() for you. Run this repeatedly in the background to watch the locks granted in proper order.
use DB_File; use strict; sub LOCK_SH { 1 } sub LOCK_EX { 2 } sub LOCK_NB { 4 } sub LOCK_UN { 8 } my($oldval, $fd, $db, %db, $value, $key); $key = shift || 'default'; $value = shift || 'magic'; $value .= " $$"; $db = tie(%db, 'DB_File', '/tmp/foo.db', O_CREAT|O_RDWR, 0644) || die "dbcreat /tmp/foo.db $!"; $fd = $db->fd; print "$$: db fd is $fd\n"; open(DB_FH, "+<&=$fd") || die "dup $!"; unless (flock (DB_FH, LOCK_SH | LOCK_NB)) { print "$$: CONTENTION; can't read during write update! Waiting for read lock ($!) ...."; unless (flock (DB_FH, LOCK_SH)) { die "flock: $!" }
.............
ok thanks,aber ist lock wircklich notwendig weil "tie" schützt die datei doch auch oder nicht? zum obigen beispiel -> gehts vielleicht auch einfacher? ich weiss schonmal dass ich LOCK_EX benötige und zweitens mit open open(DB_FH, "+<&=$fd")... kann man da auch open(LOGINS, "+<&=$fd") schreiben?
Grüsse vom Alain
...nichts ist so schlecht, als daß es nicht für irgend etwas gut wäre