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