PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl IPC::Shareable



unux
10-12-2007, 10:50
Hallo zusammen,

folgendes ist mir gestern beim coden aufgefallen:

OS: Debian Linux
Kernel: 2.6.23.9

Ich möchte in einem Script mit dem Modul IPC::Shareable einen mehrdimensionalen Hash in mein shared memory legen, damit ich mit 2 Prozessen darauf zugreifen/ihn verändern kann. An sich funktioniert das auch wie gewünscht, allerdings mit einem nicht zu unterschätzenden Nachteil:

Für jedes/n Array/Hash, das/den ich in dem o.g. Hash ablege, wird ein neues Semaphore Array angelegt. Folglich gibt es irgendwann Probleme, sobald die max. Anzahl an Arrays erzeugt wurde. Dieser Wert ist bei meinen Debian Systemen default auf 128 eingestellt, was für mich ein Problem darstellt, da ich weit mehr Arrays/Hashes in dem o.g. Hash ablegen will.
Ich habe zwar die Möglichkeit händisch diesen Wert zu ändern, was ich allerdings nicht unbedingt wegen einem so kleinen Script machen will.
Alternativ ginge es natürlich die Prozesse über Pipes/Sockets miteinander kommunizieren zu lassen, allerdings wenn es schon ein fertiges Modul für diesen Zweck gibt ... keep it simple...

Testscript:

#!/usr/bin/perl

use IPC::Shareable;
use strict;

my $handle = tie my %test, 'IPC::Shareable',undef,{create => 1,destroy => 1};

$handle->shlock;
%test = (1 => 1,2 => 2,3 => 3);
$test{"4"} = {1,2};
$handle->shunlock;

while(1) {
sleep(5);
}

Mit
ipcs -pkann man sich die benutzten Semaphore/Shared Memory plus die dazugehörenden PIDs anzeigen lassen.

Mit
ipcs -lerfährt man was über die Systemlimits.

Kann mir jemand erklären, warum das so läuft? Zur Not muss ich wohl auf die mehrdimensionalen Arrays/Hashes verzichten, mache ich aber ungern.

Greetz UnuX