167 lines
4.7 KiB
PHP
167 lines
4.7 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace Safe;
|
||
|
|
||
|
use Safe\Exceptions\PcntlException;
|
||
|
|
||
|
/**
|
||
|
* Executes the program with the given arguments.
|
||
|
*
|
||
|
* @param string $path path must be the path to a binary executable or a
|
||
|
* script with a valid path pointing to an executable in the shebang (
|
||
|
* #!/usr/local/bin/perl for example) as the first line. See your system's
|
||
|
* man execve(2) page for additional information.
|
||
|
* @param array $args args is an array of argument strings passed to the
|
||
|
* program.
|
||
|
* @param array $envs envs is an array of strings which are passed as
|
||
|
* environment to the program. The array is in the format of name => value,
|
||
|
* the key being the name of the environmental variable and the value being
|
||
|
* the value of that variable.
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_exec(string $path, array $args = null, array $envs = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($envs !== null) {
|
||
|
$result = \pcntl_exec($path, $args, $envs);
|
||
|
} elseif ($args !== null) {
|
||
|
$result = \pcntl_exec($path, $args);
|
||
|
} else {
|
||
|
$result = \pcntl_exec($path);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* pcntl_getpriority gets the priority of
|
||
|
* pid. Because priority levels can differ between
|
||
|
* system types and kernel versions, please see your system's getpriority(2)
|
||
|
* man page for specific details.
|
||
|
*
|
||
|
* @param int $pid If not specified, the pid of the current process is used.
|
||
|
* @param int $process_identifier One of PRIO_PGRP, PRIO_USER
|
||
|
* or PRIO_PROCESS.
|
||
|
* @return int pcntl_getpriority returns the priority of the process. A lower numerical value causes more favorable
|
||
|
* scheduling.
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_getpriority(int $pid = null, int $process_identifier = PRIO_PROCESS): int
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($process_identifier !== PRIO_PROCESS) {
|
||
|
$result = \pcntl_getpriority($pid, $process_identifier);
|
||
|
} elseif ($pid !== null) {
|
||
|
$result = \pcntl_getpriority($pid);
|
||
|
} else {
|
||
|
$result = \pcntl_getpriority();
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* pcntl_setpriority sets the priority of
|
||
|
* pid.
|
||
|
*
|
||
|
* @param int $priority priority is generally a value in the range
|
||
|
* -20 to 20. The default priority
|
||
|
* is 0 while a lower numerical value causes more
|
||
|
* favorable scheduling. Because priority levels can differ between
|
||
|
* system types and kernel versions, please see your system's setpriority(2)
|
||
|
* man page for specific details.
|
||
|
* @param int $pid If not specified, the pid of the current process is used.
|
||
|
* @param int $process_identifier One of PRIO_PGRP, PRIO_USER
|
||
|
* or PRIO_PROCESS.
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_setpriority(int $priority, int $pid = null, int $process_identifier = PRIO_PROCESS): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
if ($process_identifier !== PRIO_PROCESS) {
|
||
|
$result = \pcntl_setpriority($priority, $pid, $process_identifier);
|
||
|
} elseif ($pid !== null) {
|
||
|
$result = \pcntl_setpriority($priority, $pid);
|
||
|
} else {
|
||
|
$result = \pcntl_setpriority($priority);
|
||
|
}
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* The pcntl_signal_dispatch function calls the signal
|
||
|
* handlers installed by pcntl_signal for each pending
|
||
|
* signal.
|
||
|
*
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_signal_dispatch(): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \pcntl_signal_dispatch();
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* The pcntl_sigprocmask function adds, removes or sets blocked
|
||
|
* signals, depending on the how parameter.
|
||
|
*
|
||
|
* @param int $how Sets the behavior of pcntl_sigprocmask. Possible
|
||
|
* values:
|
||
|
*
|
||
|
* SIG_BLOCK: Add the signals to the
|
||
|
* currently blocked signals.
|
||
|
* SIG_UNBLOCK: Remove the signals from the
|
||
|
* currently blocked signals.
|
||
|
* SIG_SETMASK: Replace the currently
|
||
|
* blocked signals by the given list of signals.
|
||
|
*
|
||
|
* @param array $set List of signals.
|
||
|
* @param array|null $oldset The oldset parameter is set to an array
|
||
|
* containing the list of the previously blocked signals.
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_sigprocmask(int $how, array $set, ?array &$oldset = null): void
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \pcntl_sigprocmask($how, $set, $oldset);
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
*
|
||
|
* @param int $errno
|
||
|
* @return string Returns error description on success.
|
||
|
* @throws PcntlException
|
||
|
*
|
||
|
*/
|
||
|
function pcntl_strerror(int $errno): string
|
||
|
{
|
||
|
error_clear_last();
|
||
|
$result = \pcntl_strerror($errno);
|
||
|
if ($result === false) {
|
||
|
throw PcntlException::createFromPhpError();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|