使用套接字时pcntl_signal函数未命中,并且CTRL + C不起作用

甜甜圈4114

我有一个想要从终端运行的简单PHP脚本,并且能够处理信号代码。该脚本创建一个TCP服务器并处理连接。不知道为什么,但是我无法使信号处理正常工作:

<?php
declare(ticks = 1);

// Register shutdown command.
pcntl_signal(SIGINT, function ($sig) {
  echo 'Exiting with signal: ' . $sig;
  global $sock;
  global $client;
  socket_close($sock);
  socket_close($client);
  exit(1);
});

$address = '127.0.0.1';
$port = 1234;

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $address, $port) or die('Could not bind to address.');
socket_listen($sock);

while (TRUE) {
  $client = socket_accept($sock);
  if ($client) {
    $input = socket_read($client, 1024000);
    socket_write($client, var_export($input, TRUE));
    socket_write($client, 'End of data transmission.');
    socket_close($client);
  }
  usleep(100);
}

CTRL + C不会终止应用程序或运行功能。
如果我删除pcntl_signal功能,CTRL + C会按预期终止程序。

根据我所做的研究,此设置应该可以工作。我已经在PHP 5.5和5.6中进行了尝试...无法按预期工作。

hek2mgl

问题

问题是您正在使用socket_read()哪个执行阻塞IO。如果PHP处于阻塞的IO操作中,则无法处理信号。

解决方案

使用非阻塞IO从套接字读取数据。您可以socket_select()在循环中将函数与超时一起使用,以确保不会阻塞读取。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用套接字时pcntl_signal函数没有被击中并且CTRL + C不起作用

来自分类Dev

从python调用c函数不起作用

来自分类Dev

mkdir函数在C中不起作用

来自分类Dev

C ++构造函数不起作用

来自分类Dev

系统(“ $ BASHPID”)的C函数不起作用

来自分类Dev

Main中的C ++函数不起作用

来自分类Dev

C ++默认函数参数不起作用

来自分类Dev

C# Split() 函数不起作用

来自分类Dev

在C中使用malloc不起作用

来自分类Dev

在C ++中使用system();不起作用

来自分类Dev

不使用ip时c ++套接字连接不起作用

来自分类Dev

不使用ip时c ++套接字连接不起作用

来自分类Dev

从Objective-C函数调用C ++函数不起作用

来自分类Dev

使用C中的函数进行输入不起作用

来自分类Dev

函数指针声明在C中起作用,但在C ++中不起作用

来自分类Dev

代码块Ctrl + Shift + C不起作用

来自分类Dev

代码块Ctrl + Shift + C不起作用

来自分类Dev

Ctrl + C在Guake Terminal中不起作用

来自分类Dev

Ctrl + C在gnome终端中不起作用

来自分类Dev

Ctrl + Shift + C / V不起作用Debian 8 Jessie

来自分类Dev

CTRL + SHIFT + C / V在终端中不起作用

来自分类Dev

C++ 井字游戏 AI 不起作用

来自分类Dev

<c:out>标记未显示在JSP中,也不起作用

来自分类Dev

C ++函数循环和if语句不起作用

来自分类Dev

指向类的指针的C ++函数不起作用?

来自分类Dev

为什么循环不起作用?if&C函数

来自分类Dev

C ++自动推论在类构造函数中不起作用

来自分类Dev

C函数屏蔽:为什么此示例不起作用?

来自分类Dev

反向字符串的C ++函数不起作用