swoole_process源码分析之setBlocking操作

版权声明:转载请注明来源 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);
    }
}

猜你喜欢

转载自blog.csdn.net/u013702678/article/details/82928768