|
|
XCI. Semaphor und Shared Memory Funktionen
Dieses Modul bietet Unterst�tzung f�r die Nutzung von Semaphoren
und gemeinamen Speichersegmenten mit Hilfe der UNIX System V
Mechanismen zur Interprozess-Kommunikation.
Mit Hilfe von Semaphoren kann der exklusive Zugriff auf Resourcen
eines Systems sichergestellt oder die Anzahl der Prozesse begrenzt
werden, die gleichzeitig eine bestimmte Systemresource nutzen.
Mit Hilfe gemeinsamer Speichersegmente (shared memory) k�nnen
system-globale Variablen angelegt und bereitgestellt werden.
Diese Speicherbereiche stehen allen Prozessen des Systems,
insbesondere aber allen parallel laufenden PHP-Instanzen
zum Datenaustausch zur Verf�gung. Beachten Sie bitte, dass gemeinsame
Speichersegmente keinen Schutze vor konkurrierenden gleichzeitigen
Zugriffen bieten. Benutzen Sie Semaphore f�r die Koordination
solcher Zugriffe.
Tabelle 1. Limits of Shared Memory by the Unix OS SHMMAX |
Maximalgr��e eines gemeinsamen Speicherbereichs,
�blich sind 131072 Byte (128KB)
| SHMMIN |
Minimalgr��e eines gemeinsamen Speicherbereichs,
normalerweise 1 Byte
| SHMMNI |
maximale Anzahl unterschiedlicher Speichersegmente,
�blich sind 100
| SHMSEG |
Anzahl der Speichersegmente, die ein einzelner Prozess
einbinden darf, �blich sind 6
|
Beispiel 1. Koordinierter Zugriff auf gemeinsamen Speicher <?php
// gemeinsames Speichersegment beschaffen
if(! ($mkey = shm_attach(0x2328,1024,OctDec("666"))))
{ echo "shmem_attach fehlgeschlagen<br>\n"; exit;}
// Semaphor f�r Zugriffskoordination auf
// Speichersegment beschaffen
if(! ($skey = sem_get(0x2328,1,OctDec("666"))))
{ echo "sem_get fehlgeschlagen<br>\n"; exit;}
// Zugriff anfordern
if(! sem_acquire($skey))
{ echo "sem_acquire fehlgeschlagen<br>\n"; exit;}
// Wert lesen, aktualisieren und schreiben
$val = @shm_get_var($mkey,1);
if($val===false) $val=1; else $val++;
print "new value is $val<br>\n";
shm_put_var($mkey,1,$val);
// Zugriff freigeben
sem_release($skey);
?> |
|
- Inhaltsverzeichnis
- ftok --
Convert a pathname and a project identifier to a System V IPC key
- msg_get_queue --
Create or attach to a message queue
- msg_receive --
Receive a message from a message queue
- msg_remove_queue --
Destroy a message queue
- msg_send --
Send a message to a message queue
- msg_set_queue --
Set information in the message queue data structure
- msg_stat_queue --
Returns information from the message queue data structure
- sem_acquire -- Zugriff auf einen Semaphore anfordern
- sem_get -- Liefert ein Semaphore-Handle
- sem_release -- Freigabe eines angeforderten Semaphores
- sem_remove -- Remove a semaphore
- shm_attach --
Anlegen oder anbinden eines gemeinsamen Speichersegments
- shm_detach --
Beenden der Anbindung an ein gemeinsames Speichersegment
- shm_get_var --
Liest einen in einem gemeinsamen Speicherbereich
angelegten Wert.
- shm_put_var --
Aktualisiert einen in einem gemeinsamen Speicherbereich
angelegten Wert.
- shm_remove_var --
Entfernt einen in einem gemeinsamen Speicherbereich
angelegten Wert.
- shm_remove -- Entfernt ein gemeinsames Speichersegment
User Contributed Notes Semaphor und Shared Memory Funktionen |
|
php at stolt dot de
21-Sep-2000 06:58 |
|
The integer keys for sem_get() and shm_attach() have to be systemwide
unique. There is no method to ensure that no other process on the system
will use your specific key (security! and possible malfunction). Also
shared memory is very seldom used there are possibilities for conflicts!
To see the used id's you can use the program 'ipcs' (at least under
SuseLinux;) ). Thanks Christian C.
|
|
mikew at php dot net
01-Jun-2001 04:46 |
|
As for security, please look at the perm argument to shm_get. Shared
Memory blocks has the same permission semantics as unix user/group/other
file permissions. As long as your webserver is running as a user that no
other users can script to.. and as long as the permissions are set to
600, you should be fine and have no security concerns.
|
|
joe at floodwerks dot com
02-May-2002 01:30 |
|
If only Sys V message queues were supported, I would be happy.
|
|
elran70 at hotmail dot com
22-Jun-2002 05:54 |
|
Samlpe code for using most of the functions here:
$MEMSIZE =
512;// size of shared memory to allocate $SEMKEY = 1; //
Semaphore key $SHMKEY = 2; // Shared memory key
echo "Start.\n"; // Get semaphore $sem_id =
sem_get($SEMKEY, 1); if ($sem_id === false) {
echo "Fail to get semaphore"; exit; }
else echo "Got semaphore $sem_id.\n";
//
Accuire semaphore if (! sem_acquire($sem_id)) {
echo "Fail to aquire semaphore $sem_id.\n";
sem_remove($sem_id); exit; } else echo
"Success aquire semaphore $sem_id.\n";
$shm_id =
shm_attach($SHMKEY, $MEMSIZE); if ($shm_id === false) {
echo "Fail to attach shared memory.\n";
sem_remove($sem_id); exit; } else echo
"Success to attach shared memory : $shm_id.\n";
//
Write variable 1 if (!shm_put_var($shm_id, 1, "Variable
1")) { echo "Fail to put var 1 on shared
memory $shm_id.\n"; sem_remove($sem_id);
shm_remove ($shm_id); exit; } else
echo "Write var1 to shared memory.\n";
// Write
variable 2 if (!shm_put_var($shm_id, 2, "Variable
2")) { echo "Fail to put var 2 on shared
memory $shm_id.\n"; sem_remove($sem_id);
shm_remove ($shm_id); exit; } else
echo "Write var2 to shared memory.\n";
// Read
variable 1 $var1 = shm_get_var ($shm_id, 1); if ($var1
=== false) { echo "Fail to retrive Var 1 from
Shared memory $shm_id, return value=$var1.\n"; }
else echo "Read var1=$var1.\n";
// Read
variable 1 $var2 = shm_get_var ($shm_id, 2); if ($var1
=== false) { echo "Fail to retrive Var 2 from
Shared memory $shm_id, return value=$var2.\n"; }
else echo "Read var2=$var2.\n";
// Release
semaphore if (!sem_release($sem_id)) echo "Fail to
release $sem_id semaphore.\n"; else echo
"Semaphore $sem_id released.\n";
// remove shared
memory segmant from SysV if (shm_remove ($shm_id)) echo
"Shared memory successfully removed from SysV.\n";
else echo "Fail to remove $shm_id shared memory from
SysV.\n";
// Remove semaphore if
(sem_remove($sem_id)) echo "semaphore removed successfully
from SysV.\n"; else echo "Fail to remove
$sem_id semaphore from SysV.\n"; echo "End.\n";
|
|
Roman Laptev <tmp at laptev dot org>
02-Apr-2003 02:50 |
|
If you going to work with semaphore, which was created by some external
program, you can try the following code for this program (C
example):
#define SVSEM_MODE (SEM_R | SEM_A | SEM_R>>3 |
SEM_R>>6) /* 0644 */ #define PHP_SEM_NEED_NUMBER
3
/*.......*/ int semid, semflag = SVSEM_MODE | IPC_CREAT |
IPC_EXCL; struct sembuf semptr; union semun
semopts; /*.......*/ if( (semid = semget(sempath,
PHP_SEM_NEED_NUMBER, semflag)) >= 0 ) { semopts.val = 1; /*
initial value for sem */ if( semctl( semid, 0, SETVAL, semopts) <
0 ) {/*error*/} if( semctl( semid, 1, SETVAL, semopts) < 0 )
{/*error*/} /* PHP wanna zero for its own semget at third sem.
* look at ./PHP_SOURCE_PATH/ext/sysvsem/sysvsem.c */
semopts.val = 0; if( semctl( semid, 2, SETVAL, semopts) < 0 )
{/*error*/} } else if(errno == EEXIST) { /* connect only */
if( (semid = semget(sempath, PHP_SEM_NEED_NUMBER, SVSEM_MODE | IPC_CREAT))
< 0 ) {/*error*/} } else {/*error*/}
/*.......*/ /* If
you want acquire the sem */ semptr.sem_num = 0; semptr.sem_op =
-1; /* lock it */ semptr.sem_flg = SEM_UNDO; while( semop(semid,
&semptr, 1) < 0 ) {/*error*/} /*.......*/
Thanks, Roma
|
|
|
| |