15-01-2006, 01:32
|
|
|
חבר מתאריך: 09.05.05
הודעות: 1,217
|
|
אף פעם לא עבדתי על AFS, אז אני לא מדבר ספציפית על המערכת הזאת, אלא באופן כללי.
לפי המנואל, flock מממש את הפעולה בעזרת flock, fcntl או lockf, ככה ששימוש ידני ב-fcntl לא יפתור את הבעייה.
אבל לך תדע, תמיד כדאי לנסות. תבדוק ב-perlport למערכת ההפעלה הספציפית שלך (לא ציינת איזה מערכת), אולי יש שם הערה על זה, או דרך לפיתרון של הבעייה.
כשניסית להשתמש ב-flock, מה קרה בדיוק? החזיר 0 או שקיבלת fatal error?
בקשר לשאלה השנייה שלך -
קראת את החלק של perldoc שמדבר על fcntl? אם כן, מה לא הבנת שם?
מצורף החלק בחוברת של פרל שמדבר על fcntl.
קוד:
REMOVE THIS LINE
fcntl FILEHANDLE,FUNCTION,SCALAR
Implements the fcntl(2) function. You'll probably have to say
use Fcntl;
first to get the correct constant definitions. Argument processing and value return works just like "ioctl" below. For exam-
ple:
use Fcntl;
fcntl($filehandle, F_GETFL, $packed_return_buffer)
or die "can't fcntl F_GETFL: $!";
You don't have to check for "defined" on the return from "fcntl". Like "ioctl", it maps a 0 return from the system call into "0
but true" in Perl. This string is true in boolean context and 0 in numeric context. It is also exempt from the normal -w warn-
ings on improper numeric conversions.
Note that "fcntl" will produce a fatal error if used on a machine that doesn't implement fcntl(2). See the Fcntl module or your
fcntl(2) manpage to learn what functions are available on your system.
Here's an example of setting a filehandle named "REMOTE" to be non-blocking at the system level. You'll have to negotiate $| on
your own, though.
use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
$flags = fcntl(REMOTE, F_GETFL, 0)
or die "Can't get flags for the socket: $!\n";
$flags = fcntl(REMOTE, F_SETFL, $flags | O_NONBLOCK)
or die "Can't set flags for the socket: $!\n";
REMOVE THIS LINE
|