kqueue 引发OS X系统重启
bool append_connection_to_reactor(Connection * connection)
{
struct kevent event[2];
struct timespec wait_timeout = { 0, 0 };
EV_SET(&event[0], connection->get_socket(), EVFILT_READ, EV_ADD | EV_ENABLE, 0, 0, connection);
EV_SET(&event[1], connection->get_socket(), EVFILT_WRITE, EV_ADD | EV_DISABLE, 0, 0, connection);
if (-1 == kevent(m_reactor, event, sizeof(event) / sizeof(event[0]), nullptr, 0, &wait_timeout))
{
return(false);
}
return(true);
}
bool delete_connection_from_reactor(Connection * connection)
{
struct kevent event[2];
struct timespec wait_timeout = { 0, 0 };
EV_SET(&event[0], connection->get_socket(), EVFILT_READ, EV_DELETE, 0, 0, connection);
EV_SET(&event[1], connection->get_socket(), EVFILT_WRITE, EV_DELETE, 0, 0, connection);
if (-1 == kevent(m_reactor, event, sizeof(event) / sizeof(event[0]), nullptr, 0, &wait_timeout))
{
return(false);
}
return(true);
}
bool modify_connection_of_reactor(Connection * connection, bool need_send, bool need_recv)
{
struct kevent event[2];
struct timespec wait_timeout = { 0, 0 };
EV_SET(&event[0], connection->get_socket(), EVFILT_READ, (need_recv ? EV_ENABLE : EV_DISABLE), 0, 0, connection);
EV_SET(&event[1], connection->get_socket(), EVFILT_WRITE, (need_send ? EV_ENABLE : EV_DISABLE), 0, 0, connection);
if (-1 == kevent(m_reactor, event, sizeof(event) / sizeof(event[0]), nullptr, 0, &wait_timeout))
{
return(false);
}
return(true);
}
void reactor_connection_process(int fkqueue, Connection * listener)
{
const size_t max_event_count = 256;
struct kevent connection_events[max_event_count];
struct timespec wait_timeout = { 1, 0 }; // seconds
while (running())
{
int event_count = kevent(fkqueue, nullptr, 0, connection_events, max_event_count, &wait_timeout);
if (-1 == event_count)
{
if (-1 == fkqueue)
{
break;
}
if (is_net_blocking_error())
{
continue;
}
else
{
printf("kevent failed: %d\n", net_error());
break;
}
}
else if (0 == event_count)
{
continue;
}
for (int index = 0; index < event_count; ++index)
{
struct kevent & connection_event = connection_events[index];
Connection * connection = reinterpret_cast<Connection *>(connection_event.udata);
if (listener == connection))
{
/* notify to accept */
Connection * new_connection = do_accept(listener);
append_connection_to_reactor(new_connection);
}
else
{
if (EVFILT_READ == connection_event.filter)
{
/* notify to recv */
do_recv(connection);
}
else if (EVFILT_WRITE == connection_event.filter)
{
/* notify to send */
do_send(connection);
if (send_buffer_is_empty()) /* nothing need to send */
{
bool need_send = false;
bool need_recv = true;
modify_connection_of_reactor(Connection * connection, need_send, need_recv);
}
}
}
}
}
}
}
我写了个滚雪球一样的测试程序(单个数据越来越大),当最大数据为30 * 20 bytes时,正常。
当最大数据设定到100 * 20 bytes时,机器就会立即自动异常重启(不论作为请求方还是响应方),看启动报告,是内核崩溃了
用了两台OS X 10.11测试,都是一样的,一设定到100 * 20 bytes 的数据量,就直接重启了
不知道,有没有谁碰到过类似的情况。。。
确定代码其他地方没问题,因为代码原本是用epoll来实现的,改成OS X版本,只是将epoll相关函数改成kevent相关函数
也就是上述代码是不同的,其他代码应该是没问题的
关于kqueue的用法,不是特别了解,按我现有的理解和epoll应该差不多,但是遇到这个问题,我又不敢肯定了
欢迎指出kqueue的用法不当的地方。
相关推荐
nginx服务部署1
它能够运行在多种操作系统上,包括UNIX、Linux、BSD、Mac OS X、Solaris,以及Microsoft Windows。在常见的Web服务软件中,Nginx以其独特的特性逐渐脱颖而出。
httpsqs安装包和依赖包
Libevent支持多种事件模型,包括Epoll(Linux),KQueue(FreeBSD,OpenBSD,Mac OS X)等。
evpp so load system
**事件驱动编程**:EVPP基于epoll(Linux上的高效I/O事件通知机制)和Kqueue(FreeBSD、Mac OS X上的类似机制)实现,能高效地处理大量并发连接。2.
弱电网下光伏并网逆变器序阻抗建模仿真复现扫频法【序阻抗判断稳定性】
内容概要:本文聚焦于弱电网条件下光伏并网逆变器的序阻抗建模与稳定性分析,系统阐述了基于扫频法的阻抗特性仿真与复现方法。通过构建正负序阻抗模型,深入剖析逆变器在弱电网环境中的动态响应特性,结合锁相环、电流环等关键控制环节对系统阻抗的影响机制,采用序阻抗稳定性判据评估多机并网或复杂电网条件下的系统稳定裕度。研究在Simulink平台中实现激励信号注入、频率响应采集与阻抗曲线绘制,为高比例新能源接入背景下并网系统的稳定性分析提供了可靠的仿真手段与理论支撑,尤其适用于SCI级别论文成果的复现与拓展验证。; 适合人群:电力电子、新能源并网技术及相关领域的硕士/博士研究生、科研人员,以及从事光伏逆变器、微电网稳定控制开发的工程技术人员。; 使用场景及目标:①掌握扫频法在电力电子装置阻抗建模中的具体实施流程;②理解并应用基于序阻抗的稳定性判据进行系统稳定边界分析;③用于高水平学术论文(如SCI期刊)中阻抗建模与稳定性分析部分的仿真复现与方法验证; 阅读建议:建议读者结合文中所述方法与提供的参考文献,自主搭建Simulink仿真模型,逐步完成扰动信号设计、数据采集、傅里叶分析及阻抗拟合全过程,深入探究控制参数变化对系统阻抗特性和稳定性的具体影响,强化理论与实践的融合能力。
三相并网逆变器虚拟阻抗+统一有源阻尼策略SVPWM+SPWM调制仿真
内容概要:本文档系统性地介绍了三相并网逆变器的核心控制技术及其在复杂电网环境下的仿真应用,重点涵盖虚拟阻抗与统一有源阻尼策略在SVPWM和SPWM调制方式下的实现方法,旨在提升逆变器的稳定性与电能质量。内容包括无功功率扰动孤岛检测、中点电位平衡控制、低电压穿越(LVRT)、模型预测控制(MPC)、正负序分离、电网前馈控制等关键技术,并扩展至风储联合调频、微电网下垂控制、虚拟同步发电机(VSG)、构网型逆变器等多种典型电力系统应用场景。所有技术均配有基于Simulink/Matlab平台的完整仿真模型、参考文献及说明文档,强调理论分析与仿真实践的深度融合,突出科研中“借力”与创新思维的重要性。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子与可再生能源系统开发的工程师;具备MATLAB/Simulink仿真基础和电力系统专业知识的技术人员。; 使用场景及目标:①开展三相并网逆变器控制策略的研究与优化设计;②复现高水平学术论文中的控制算法;③完成毕业课题、科研项目或工程仿真验证;④掌握虚拟阻抗、有源阻尼、SVPWM/SPWM调制、MPC、VSG等核心技术的建模与实现方法;⑤支撑微电网、构网型变流器等前沿方向的科研攻关。; 阅读建议:建议按照资源目录结构化学习,优先选择与自身研究方向契合的内容模块,结合提供的仿真模型、参考文献和说明材料进行实操演练,注重从理论推导到仿真实现的全过程理解,充分利用共享网盘资源深化技术掌握,提升科研效率与创新能力。


