swoole_process原始碼分析之setBlocking操作
阿新 • • 發佈:2018-12-13
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; } 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);
}
while (ret == -1 && errno == EINTR);
if (ret < 0)
{
swSysError("ioctl(%d, FIONBIO, %d) failed.", sock, nonblock);
}
}