nowait.phpt 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. --TEST--
  2. sem_acquire with nowait
  3. --SKIPIF--
  4. <?php // vim600: ts=4 sw=4 syn=php fdm=marker
  5. if(!extension_loaded('sysvsem') || !extension_loaded('pcntl')) {
  6. die("skip sysvsem and pcntl required");
  7. }
  8. ?>
  9. --FILE--
  10. <?php
  11. $SEMKEY = ftok(__FILE__, 'P'); // Semaphore key
  12. $pid = pcntl_fork();
  13. if ($pid) {
  14. echo "Parent.\n";
  15. pcntl_signal(SIGCHLD, SIG_IGN);
  16. // Get semaphore
  17. $sem_id = sem_get($SEMKEY, 1);
  18. if ($sem_id === FALSE) {
  19. echo "P: fail to get semaphore";
  20. exit;
  21. }
  22. echo "P: got semaphore $sem_id.\n";
  23. register_shutdown_function(function () use ($sem_id) {
  24. echo "P: cleanup.\n";
  25. sem_remove($sem_id);
  26. });
  27. // Acquire semaphore
  28. if (! sem_acquire($sem_id)) {
  29. echo "P: fail to acquire semaphore $sem_id.\n";
  30. sem_remove($sem_id);
  31. exit;
  32. }
  33. echo "P: success acquire semaphore $sem_id.\n";
  34. usleep(20000);
  35. echo "P: releases.\n";
  36. sem_release($sem_id);
  37. usleep(5000);
  38. // Acquire semaphore
  39. if (! sem_acquire($sem_id)) {
  40. echo "P: fail to acquire semaphore $sem_id.\n";
  41. sem_remove($sem_id);
  42. exit;
  43. }
  44. echo "P: success acquire semaphore $sem_id.\n";
  45. $status = null;
  46. pcntl_waitpid($pid, $status);
  47. } else {
  48. usleep(10000);
  49. echo "Child.\n";
  50. // Get semaphore
  51. $sem_id = sem_get($SEMKEY, 1);
  52. if ($sem_id === FALSE) {
  53. echo "C: fail to get semaphore";
  54. exit;
  55. }
  56. echo "C: got semaphore $sem_id.\n";
  57. // Acquire semaphore
  58. if (! sem_acquire($sem_id)) {
  59. echo "C: fail to acquire semaphore $sem_id.\n";
  60. exit;
  61. }
  62. echo "C: success acquire semaphore $sem_id.\n";
  63. echo "C: releases.\n";
  64. sem_release($sem_id);
  65. usleep(10000);
  66. // Acquire semaphore
  67. if (! sem_acquire($sem_id, true)) {
  68. echo "C: fail to acquire semaphore $sem_id.\n";
  69. exit;
  70. }
  71. echo "C: success acquire semaphore $sem_id.\n";
  72. }
  73. ?>
  74. --EXPECTF--
  75. Parent.
  76. P: got semaphore Resource id #%i.
  77. P: success acquire semaphore Resource id #%i.
  78. Child.
  79. C: got semaphore Resource id #%i.
  80. P: releases.
  81. C: success acquire semaphore Resource id #%i.
  82. C: releases.
  83. P: success acquire semaphore Resource id #%i.
  84. C: fail to acquire semaphore Resource id #%i.
  85. P: cleanup.