版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/82928768
swoole_process提供的setBlocking用于设置管道是否为阻塞模式。默认Process
的管道为同步阻塞。
function swoole_process->setBlocking(bool $blocking = true);
$blocking
布尔型,默认为true
,设置为false
时管道为非阻塞模式
下面我们看看其实现。
static PHP_METHOD(swoole_process, setBlocking)
{
zend_bool blocking;
//解析输入参数信息
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &blocking) == FAILURE)
{
RETURN_FALSE;
}
//获取swoole内部封装的对象信息
swWorker *process = swoole_get_object(getThis());
if (process->pipe == 0)//未正确初始化管道信息
{
swoole_php_fatal_error(E_WARNING, "no pipe, can not setBlocking the pipe.");
RETURN_FALSE;
}
if (blocking)//输入参数为设置为阻塞的,则调用设置为阻塞的操作
{
swSetBlock(process->pipe);
}
else//设置为非阻塞的
{
swSetNonBlock(process->pipe);
}
if (SwooleG.main_reactor)//如果是异步流程
{
swConnection *_socket = swReactor_get(SwooleG.main_reactor, process->pipe);//获取连接信息
if (_socket)
{
_socket->nonblock = blocking ? 0 : 1;//设置阻塞与非阻塞的属性
}
}
}
void swoole_ioctl_set_block(int sock, int nonblock)
{
int ret;
do
{
ret = ioctl(sock, FIONBIO, &nonblock);//调用ioctl设置属性
}
while (ret == -1 && errno == EINTR);
if (ret < 0)
{
swSysError("ioctl(%d, FIONBIO, %d) failed.", sock, nonblock);
}
}