为什么注册 SIGHUP 处理函数会阻止在 PHP CLI 中等待输入时单击“X”关闭 XTerm 窗口?

问题描述 投票:0回答:1

Linux 6.1。 PHP 8.2.7。 KDE 等离子 5.x。 X11.

长期以来,我的 PHP CLI 脚本一直存在一个非常烦人的问题,该问题不断出现并导致问题。我现在终于做了一个最小的测试用例,希望能一劳永逸地解决这个问题。

如果你做了这三件事:

  1. SIGHUP
    信号注册一个处理函数(留空/不执行任何操作)...
  2. 检查用户的输入 (
    fgets(STDIN);
    )...
  3. 运行 PHP CLI 脚本,如
    xterm -e php test.php
    (由于与此问题无关的复杂原因,我必须这样称呼它)...

...那么生成的 XTerm 终端仿真器窗口将无法通过单击右上角的“X”来关闭!如果你点击它,什么也不会发生。

一旦您注释或删除注册信号处理程序的行,它就会让您在像上面一样运行时关闭窗口。

测试用例

  • xterm -e php 1.php
    = “X”不能 单击以关闭 XTerm 窗口。
  • xterm -e php 2.php
    = 单击“X”CAN 可关闭 XTerm 窗口。

1.php

<?php
    
    function dummy_handler() { /* deliberately left empty */ }
    pcntl_signal(SIGHUP, 'dummy_handler');
    $input = fgets(STDIN);

2.php

<?php

    function dummy_handler() { /* deliberately left empty */ }
    $input = fgets(STDIN);

我可以做什么来绕过这个?为了说清楚,我需要注册处理函数,我需要用

xterm
调用
-e
,并且我需要“等待输入”。我还应该指出,我已经尝试过那些经典的
setsid
nohup
Linux 技巧,但没有任何运气。我不明白到底是什么原因造成的。

请不要告诉我“只要记住使用 Ctrl + C”之类的;我需要能够通过单击“X”在某些 PHP CLI 脚本的自然寿命结束之前关闭它们,并且我需要能够在其关闭之前调用一些清理例程。 (在这个最小的示例中,处理函数是空的,只是为了证明在我不做任何奇怪/复杂的事情的情况下它仍然会发生。)

无论桌面环境和终端模拟器如何,它都可能发生,但我在 Linux 上使用 KDE Plasma 和 XTerm,这就是我需要它来工作的原因。

更新:在处理函数中使用

exit(1);
没有什么区别。

php linux signals fgets xterm
1个回答
0
投票

您可以通过将命令包装在 shell 命令中来解决此问题:

xterm -e sh -c php 1.php
© www.soinside.com 2019 - 2024. All rights reserved.