swoole_process源码分析之close操作

版权声明:转载请注明来源 https://blog.csdn.net/u013702678/article/details/82936239

swoole_process提供的close用于关闭创建的好的管道。

bool swoole_process->close(int $which = 0);
  • $which 指定关闭哪一个管道,默认为0表示同时关闭读和写,1:关闭写,2关闭读

下面我们看下其流程。

static PHP_METHOD(swoole_process, close)
{
    long which = 0;
    //解析输入参数信息,这里的输入参数就一个布尔类型,用于控制是关闭读还是关闭写
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &which) == FAILURE)
    {
        RETURN_FALSE;
    }

    swWorker *process = swoole_get_object(getThis());//获取swoole内部封装对象swWorker
    if (process->pipe == 0)//如果未开启管道
    {
        swoole_php_fatal_error(E_WARNING, "no pipe, can not close the pipe.");
        RETURN_FALSE;
    }

    int ret;
    if (which == SW_PIPE_CLOSE_READ)//如果是关闭读
    {
        ret = shutdown(process->pipe, SHUT_RD);//调用shutdown关闭读,这属于半关闭
    }
    else if (which == SW_PIPE_CLOSE_WRITE)//如果是关闭写
    {
        ret = shutdown(process->pipe, SHUT_WR);//调用shutdown关闭写,这属于半关闭
    }
    else//默认情况,同时关闭读和写
    {
        ret = swPipeUnsock_close_ext(process->pipe_object, which);//同时关闭读和写
    }
    if (ret < 0)
    {
        swoole_php_fatal_error(E_WARNING, "close() failed. Error: %s[%d]", strerror(errno), errno);
        RETURN_FALSE;
    }
    if (which == 0)//默认情况,同时关闭读和写的情况下,释放管道对象
    {
        process->pipe = 0;
        efree(process->pipe_object);
        process->pipe_object = NULL;
    }
    RETURN_TRUE;
}
int swPipeUnsock_close_ext(swPipe *p, int which)
{
    int ret1 = 0, ret2 = 0;
    swPipeUnsock *object = p->object;

    if (which == SW_PIPE_CLOSE_MASTER)
    {
        if (object->pipe_master_closed)//如果已经关闭,直接返回
        {
            return SW_ERR;
        }
        ret1 = close(object->socks[1]);//调用close关闭master端
        object->pipe_master_closed = 1;
    }
    else if (which == SW_PIPE_CLOSE_WORKER)
    {
        if (object->pipe_worker_closed)//如果已经关闭,直接返回
        {
            return SW_ERR;
        }
        ret1 = close(object->socks[0])//调用close关闭worker端
        object->pipe_worker_closed = 1;
    }
    else//默认情况,同时关闭读和写
    {
        ret1 = swPipeUnsock_close_ext(p, SW_PIPE_CLOSE_MASTER);//关闭master
        ret2 = swPipeUnsock_close_ext(p, SW_PIPE_CLOSE_WORKER);//关闭worker
    }

    return 0 - ret1 - ret2;
}

猜你喜欢

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