Question

J'ai un programme CGI Perl qui s'exécute sous mod_perl. Dans le cadre de ce programme, je souhaite empêcher une ressource d'accéder simultanément à plusieurs processus.

# 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)

Le problème est le suivant:

  1. Comment puis-je faire en sorte que Code (1) crée un nouveau sémaphore SEULEMENT lorsque le sémaphore si l'identifiant 10023 n'a jamais été créé auparavant, par le même processus ou par un autre processus?
  2. Comment puis-je exécuter Code (2) UNIQUEMENT la première fois que je crée le sémaphore avec 10023 id? Un sémaphore sera initialisé UNE SEULE FOIS.

Une autre approche consiste à créer un fichier vide à des fins de verrouillage. Cependant, cela finira par avoir des milliers de fichiers temporaires. texte du lien

Était-ce utile?

La solution

L'ajout de l'indicateur IPC_EXCL a pour effet que le semget sous-jacent crée un nouveau sémaphore ou échoue. Vous pouvez l'utiliser pour obtenir l'effet souhaité.

Cela devrait fonctionner pour vous:

#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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top