summaryrefslogtreecommitdiff
path: root/ext/pcntl/tests/002.phpt
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pcntl/tests/002.phpt')
-rw-r--r--ext/pcntl/tests/002.phpt103
1 files changed, 103 insertions, 0 deletions
diff --git a/ext/pcntl/tests/002.phpt b/ext/pcntl/tests/002.phpt
new file mode 100644
index 0000000..3cec883
--- /dev/null
+++ b/ext/pcntl/tests/002.phpt
@@ -0,0 +1,103 @@
+--TEST--
+pcntl: pcntl_sigprocmask(), pcntl_sigwaitinfo(), pcntl_sigtimedwait()
+--SKIPIF--
+<?php
+ if (!extension_loaded('pcntl')) die('skip pcntl extension not available');
+ elseif (!extension_loaded('posix')) die('skip posix extension not available');
+ elseif (!function_exists('pcntl_sigwaitinfo') or !function_exists('pcntl_sigtimedwait')) die('skip required functionality is not available');
+ elseif (!defined('CLD_EXITED')) die('skip CLD_EXITED not defined');
+?>
+--FILE--
+<?php
+
+$pid = pcntl_fork();
+if ($pid == -1) {
+ die('failed');
+} else if ($pid) {
+ pcntl_sigprocmask(SIG_BLOCK, array(SIGCHLD,(string)SIGTERM));
+ $oldset = array();
+ pcntl_sigprocmask(SIG_BLOCK, array(), $oldset);
+ var_dump(in_array(SIGCHLD, $oldset));
+ var_dump(in_array(SIGTERM, $oldset));
+
+ posix_kill(posix_getpid(), SIGTERM);
+ $signo = pcntl_sigwaitinfo(array(SIGTERM), $siginfo);
+ echo "signo == SIGTERM\n";
+ var_dump($signo === SIGTERM && $signo === $siginfo['signo']);
+ echo "code === SI_USER || SI_NOINFO\n";
+ if (defined('SI_NOINFO')) {
+ var_dump(($siginfo['code'] === SI_USER) || ($siginfo['code'] === SI_NOINFO));
+ } else {
+ var_dump($siginfo['code'] === SI_USER);
+ }
+
+ pcntl_signal(SIGCHLD, function($signo){});
+ posix_kill($pid, SIGTERM);
+ $signo = pcntl_sigwaitinfo(array((string)SIGCHLD), $siginfo);
+ echo "signo == SIGCHLD\n";
+ var_dump($signo === SIGCHLD && $signo === $siginfo['signo']);
+ echo "code === CLD_KILLED\n";
+ var_dump($siginfo['code'] === CLD_KILLED);
+ echo "signo === SIGCHLD\n";
+ var_dump($siginfo['signo'] === SIGCHLD);
+ echo "signo === uid\n";
+ var_dump($siginfo['uid'] === posix_getuid());
+ echo "signo === pid\n";
+ var_dump($siginfo['pid'] === $pid);
+ pcntl_waitpid($pid, $status);
+
+ set_error_handler(function($errno, $errstr) { echo "Error triggered\n"; }, E_WARNING);
+
+ echo "sigprocmask with invalid arguments\n";
+
+ /* Valgrind expectedly complains about this:
+ * "sigprocmask: unknown 'how' field 2147483647"
+ * Skip */
+ if (getenv("USE_ZEND_ALLOC") !== '0') {
+ var_dump(pcntl_sigprocmask(PHP_INT_MAX, array(SIGTERM)));
+ } else {
+ echo "Error triggered\n";
+ echo "bool(false)\n";
+ }
+ var_dump(pcntl_sigprocmask(SIG_SETMASK, array(0)));
+
+ echo "sigwaitinfo with invalid arguments\n";
+ var_dump(pcntl_sigwaitinfo(array(0)));
+
+ echo "sigtimedwait with invalid arguments\n";
+ var_dump(pcntl_sigtimedwait(array(SIGTERM), $signo, PHP_INT_MAX, PHP_INT_MAX));
+} else {
+ $siginfo = NULL;
+ pcntl_sigtimedwait(array(SIGINT), $siginfo, 3600, 0);
+ exit;
+}
+
+?>
+--EXPECTF--
+bool(true)
+bool(true)
+signo == SIGTERM
+bool(true)
+code === SI_USER || SI_NOINFO
+bool(true)
+signo == SIGCHLD
+bool(true)
+code === CLD_KILLED
+bool(true)
+signo === SIGCHLD
+bool(true)
+signo === uid
+bool(true)
+signo === pid
+bool(true)
+sigprocmask with invalid arguments
+Error triggered
+bool(false)
+Error triggered
+bool(false)
+sigwaitinfo with invalid arguments
+Error triggered
+bool(false)
+sigtimedwait with invalid arguments
+Error triggered
+int(-1)