我试图通过使用网页中的按钮将kill -10(SIGUSER1)发送到进程ID,我尝试了不同的方法来发送信号,同时将PHP变量(包含PID)传递给shell.以下是我所拥有的:
$next = posix_kill($pid3, 10);
Run Code Online (Sandbox Code Playgroud)
现在,这给了我以下错误:
PHP Warning: posix_kill() expects parameter 1 to be long,
string given in /var/www/parse2.php on line 15
Run Code Online (Sandbox Code Playgroud)
请指教
大多数php函数会尝试将其参数强制转换为适当的数据类型(如果可能的话).如果可能的话,php函数自动将字符串自动转换为数字类型(如int或float)是非常常见的.
但是,有些只是不是这样编写的,您需要提供手册中指定的数据类型.
"long"是数字类型,因此只需转换为整数.假设$ pid3是一个数字字符串,因此演员表会产生一些明智的结果.
$next = posix_kill((int) $pid3, 10);
Run Code Online (Sandbox Code Playgroud)
尝试一下:
$next = posix_kill((long)$pid3, 10);
Run Code Online (Sandbox Code Playgroud)
Intval返回一个int,因此警告不会消失,但它可能会起作用
因此,既然您似乎仍然有问题,那就更好了,就像建议的elswhere一样:
$next = posix_kill(intval($pid3), 10);
Run Code Online (Sandbox Code Playgroud)
如果这样不起作用,建议您向我们展示您使用的php版本。
除非您有空格,否则请尝试:
$next = posix_kill(intval(trim($pid3)), 10);
Run Code Online (Sandbox Code Playgroud)
更新:
因此,现在您可以正常运行了,您需要捕获信号并使它执行某些操作,需要附加一个回调函数,因为我不知道其余的代码。您需要这样的东西:
pcntl_signal(SIGUSR1, "sig_handler");
Run Code Online (Sandbox Code Playgroud)
然后在该信号上执行以下操作:
function sig_handler($sig) {
switch($sig) {
case SIGUSR1:
// logtrace(1,"received USR1 signal.");
break;
...
Run Code Online (Sandbox Code Playgroud)
我只想一件事,我假设我们发送信号的过程是一个PHP脚本。否则,我认为您可以使用它,但是还没有做很多事情(尚未完成)