سؤال

لدي Perl CGI البرنامج الذي ينفذ تحت mod_perl.ضمن البرنامج ، أود أن منع من الوصول إلى الموارد من خلال عمليات متعددة في نفس الوقت.

# Semaphore Initialization Code
# 10023 is unique id, and this id will be same across different apache process.
# 1, Only one semaphore being created.
# 0722, as all process will be execute under apache account. Hence, they will all having '7' privilege.
my $sem = new IPC::Semaphore(10023, 1, 0722 | IPC_CREAT); # Code(1)
# Set 0th (one and only one) semaphore's value to 1, As I want to use this semaphore as mutex.
$sem->setval(0, 1);                                       # Code(2)

المشكلة هي :

  1. كيف يمكنني جعل رمز(1) خلق جديد إشارة فقط عند الإشارة إذا كان 10023 id لم يتم إنشاؤه من قبل ، إما عن طريق نفس العملية أو غيرها من العمليات ؟
  2. كيف يمكنني تنفيذ التعليمات البرمجية(2) فقط في المرة الأولى لقد خلق سيمافور مع 10023 الهوية ؟ إشارة لابد من تهيئة وقت واحد.

وثمة نهج آخر هو إنشاء ملف فارغ من أجل تأمين الغرض.ومع ذلك ، فإن هذا سوف ينتهي وجود الآلاف من الملفات المؤقتة.وصلة النص

هل كانت مفيدة؟

المحلول

إضافة IPC_EXCL العلم الأسباب الكامنة semget إما إنشاء إشارة أو تفشل.يمكنك استخدام هذا للحصول على التأثير الذي تريده.

هذا يجب أن تعمل من أجلك:

#Attempt to create (but not get existing) semaphore
my $sem = IPC::Semaphore->new(10023, 1, 0722 | IPC_CREAT | IPC_EXCL);
if ($sem) {
    #success, semaphore created, proceed to set.
    print "new semaphore\n";
    $sem->setval(0, 1);
}
else {
    #obtain the semaphore normally
    print "existing semaphore\n";
    $sem = IPC::Semaphore->new(10023, 1, 0722); #no IPC_CREAT here
    die "could not obtain semaphore?" unless $sem;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top