|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
PatchesPull Requests |
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Nov 05 12:00:01 2025 UTC |
Description: ------------ Test in OS: Debian 8.5 and CentOS 7.2.1511 PHP: 5.6.25 and 7.0.10 configure: --enable-pcntl --enable-sysvshm --enable-sysvsem --enable-sysvmsg Look like the semaphore resource in each child process is an clone not a reference. The semaphore resources state in child process was cloned from the last state before parent process triggered pcntl_fork(). Test script: --------------- <?php $ipcs = "ipcs -s -i `ipcs -s | grep 0x0001e240 | awk '{print $2}'` | awk 'NR==9'"; $sem = sem_get(123456, 3, 0666, 0); echo exec($ipcs) . " first\n"; for ($i = 0; $i < 3; $i++) { sem_acquire($sem); if (pcntl_fork() === 0) { echo exec($ipcs) . " $i start\n"; for ($j = 0; $j < 3; $j++) sem_release($sem); echo exec($ipcs) . " $i end\n"; exit(0); } } usleep(50000); echo exec($ipcs) . " last\n"; sem_remove($sem); Expected result: ---------------- 6 times Warning semaphore's max_acquirce <= 3 Actual result: -------------- 0 3 0 0 7128 first 0 0 0 0 7128 2 start 0 3 0 0 7138 1 start Warning: sem_release(): SysV semaphore 4 (key 0x1e240) is not currently acquired in /tmp/sem.php on line 10 0 5 0 0 7137 0 start Warning: sem_release(): SysV semaphore 4 (key 0x1e240) is not currently acquired in /tmp/sem.php on line 10 Warning: sem_release(): SysV semaphore 4 (key 0x1e240) is not currently acquired in /tmp/sem.php on line 10 0 6 0 0 7136 1 end 0 4 0 0 7137 2 end 0 1 0 0 7138 0 end 0 0 0 0 7136 last