1--TEST-- 2Test sem_acquire with nowait option 3--EXTENSIONS-- 4sysvsem 5pcntl 6--FILE-- 7<?php 8$P_SEMKEY = ftok(__FILE__, 'P'); // Parent Semaphore key 9$C_SEMKEY = ftok(__FILE__, 'C'); // Child Semaphore key 10 11echo "P: parent process running.\n"; 12 13pcntl_signal(SIGCHLD, SIG_IGN); 14 15// Get semaphore for parent 16$p_sem_id = sem_get($P_SEMKEY, 1); 17if ($p_sem_id === FALSE) { 18 echo "P: failed to parent get semaphore.\n"; 19 exit; 20} 21 22echo "P: got semaphore.\n"; 23 24// Get semaphore for child 25$c_sem_id = sem_get($C_SEMKEY, 1); 26if ($c_sem_id === FALSE) { 27 echo "P: failed to child get semaphore.\n"; 28 exit; 29} 30 31 32// Acquire semaphore for parent 33if (!sem_acquire($p_sem_id)) { 34 echo "P: fail to acquire semaphore.\n"; 35 sem_remove($p_sem_id); 36 exit; 37} 38echo "P: acquired semaphore.\n"; 39 40// Acquire semaphore for child 41if (!sem_acquire($c_sem_id)) { 42 echo "P: failed to acquire semaphore.\n"; 43 sem_remove($c_sem_id); 44 exit; 45} 46echo "P: acquired semaphore.\n"; 47// Fork process 48$pid = pcntl_fork(); 49 50if ($pid) { 51 52 register_shutdown_function(function () use ($p_sem_id) { 53 echo "P: removing semaphore.\n"; 54 sem_remove($p_sem_id); 55 }); 56 57 // Release semaphore after 50ms 58 usleep(50000); 59 60 /* Wait for the child semaphore to be released to 61 to release the parent semaphore */ 62 if (!sem_acquire($c_sem_id)) { 63 echo "P: failed to acquire semaphore.\n"; 64 exit; 65 } 66 67 /* Release the child semahpore before releasing 68 the releasing the parent semaphore and letting 69 the child continue execution */ 70 sem_release($c_sem_id); 71 72 echo "P: releasing semaphore.\n"; 73 if (!sem_release($p_sem_id)) { 74 echo "P: failed to release semaphore.\n"; 75 } 76 77 $status = null; 78 pcntl_waitpid($pid, $status); 79 80} else { 81 82 register_shutdown_function(function () use ($c_sem_id) { 83 echo "C: removing semaphore.\n"; 84 sem_remove($c_sem_id); 85 }); 86 87 echo "C: child process running.\n"; 88 89 // Have the semaphore after process forked 90 echo "C: got semaphores.\n"; 91 92 // This should fail to get to the semaphore and not wait 93 if (sem_acquire($p_sem_id, true)) { 94 echo "C: test failed, Child was able to acquire semaphore.\n"; 95 exit; 96 } 97 98 // The child process did not wait to acquire the semaphore 99 echo "C: failed to acquire semaphore.\n"; 100 101 echo "C: releasing semaphore.\n"; 102 if (!sem_release($c_sem_id)) { 103 echo "C: failed to release semaphore.\n"; 104 } 105 106 // Acquire semaphore with waiting 107 if (!sem_acquire($p_sem_id)) { 108 echo "C: fail to acquire semaphore.\n"; 109 exit; 110 } 111 echo "C: success acquired semaphore.\n"; 112 113 echo "C: releasing semaphore.\n"; 114 sem_release($p_sem_id); 115} 116 117?> 118--EXPECT-- 119P: parent process running. 120P: got semaphore. 121P: acquired semaphore. 122P: acquired semaphore. 123C: child process running. 124C: got semaphores. 125C: failed to acquire semaphore. 126C: releasing semaphore. 127P: releasing semaphore. 128C: success acquired semaphore. 129C: releasing semaphore. 130C: removing semaphore. 131P: removing semaphore. 132