4

我正在尝试通过使用网页中的按钮将 kill -10 (SIGUSER1) 发送到进程 ID,我尝试了不同的方法来发送信号,同时将 PHP 变量(保存 PID)传递给 shell。以下是我所拥有的:

$next = posix_kill($pid3, 10);

现在,这给了我以下错误:

PHP Warning:  posix_kill() expects parameter 1 to be long, 
              string given in /var/www/parse2.php on line 15

请指教

4

3 回答 3

6

试试这个:

$next = posix_kill((long)$pid3, 10);

Intval返回一个 int,因此警告不会消失,但它可能会起作用

因此,既然您似乎有问题,最好还是建议其他地方:

$next = posix_kill(intval($pid3), 10);

如果这不起作用,我建议向我们展示您使用的 php 版本。

除非您有空间,否则请尝试:

$next = posix_kill(intval(trim($pid3)), 10);

更新:

所以现在你让它工作了,你需要捕获信号并让它做一些事情,你需要附加一个回调函数,因为我不知道你的其余代码。你需要这样的东西:

pcntl_signal(SIGUSR1, "sig_handler");

然后对该信号做一些事情:

function sig_handler($sig) {

   switch($sig) {
      case SIGUSR1:
         // logtrace(1,"received USR1 signal.");
         break;
   ...

我只是想一件事,我假设我们发送信号的过程是一个 PHP 脚本。否则,我认为您可以正常工作,但还没有做很多(还)

于 2012-12-31T17:51:14.000 回答
5

如果可能,大多数 php 函数将尝试将其参数强制转换为适当的数据类型。如果可能的话,php 函数自动将字符串转换为 int 或 float 等数字类型非常常见。

但是,有些不是这样写的,您需要提供手册中指定的数据类型。

“long”是数字类型,所以只需转换为整数。这假设 $pid3 是一个数字字符串,因此强制转换会产生一些合理的结果。

$next = posix_kill((int) $pid3, 10);
于 2012-12-31T17:46:28.510 回答
1

我认为您可以将其转换为 int 然后它应该可以工作:

$next = posix_kill((int)$pid3, 10);

您的变量是字符串或其他任何东西。

或试试这个:

如何将 long 转换为字符串?

于 2012-12-31T17:45:31.373 回答