从 PHP 中的信号编号获取信号名称



假设我有一个信号编号,假设它是15,我怎样才能把它恢复为信号名称?(在Linux上,15是SIGTERM,所以在这种情况下,如果在Linux上运行,我想要字符串"SIGTERM"(

Linux 有 char *strsignal(int sig(,不幸的是 PHP 似乎没有,但有了get_defined_constants(true),人们可能会实现类似的东西,这是我的尝试:

function strsignal(int $signo): ?string
{
foreach (get_defined_constants(true)['pcntl'] as $name => $num) {
// the _ is to ignore SIG_IGN and SIG_DFL and SIG_ERR and SIG_BLOCK and SIG_UNBLOCK and SIG_SETMARK, and maybe more, who knows
if ($num === $signo && substr($name, 0, 3) === "SIG" && $name[3] !== "_") {
return $name;
}
}
return null;
}

var_dump(strsignal(15));回报string(7) "SIGTERM"

:)

  • 在 php 上游提出了 posix_strsignal(( 的请求: https://bugs.php.net/bug.php?id=78700

从 get_defined_constants(( 获取信号名称,就像接受的答案一样,但没有 foreach 和单行:

$signum=15;
$signal_name=array_search($signum, array_filter(get_defined_constants(true)['pcntl'], fn($name)=>preg_match("/^SIG[A-Z]/",$name), ARRAY_FILTER_USE_KEY), true);
var_dump($signal_name);

get_defined_constants(true)['pcntl']返回一个包含所有 pcntl 常量名称和相对值的数组。数组通过回调箭头函数进行array_filter()过滤,该函数反过来使用仅返回以 SIG 开头的字符串后跟大写字母的preg_match()过滤数据。这个干净的数组最终可以通过array_search()搜索其值。

或者,您可以将数组值直接过滤到 array_filter(( 中:

$signum=15;
$signal_name=current(array_flip(array_filter(get_defined_constants(true)['pcntl'], function($value,$name) use ($signum) {return (preg_match("/^SIG[A-Z]/",$name)&&($value==$signum));}, ARRAY_FILTER_USE_BOTH)));
var_dump($signal_name);

最新更新