SIGPROF在使用谷歌perftools时杀死了我的服务器
SIGPROF kills my server when using google perftools
我有一个用C/C++编写的多线程服务器进程,我正试图用Google perftools对其进行评测。然而,当我使用perftools运行该进程时,很快我的服务器就会因"系统调用中断"错误而停止,我认为这是由传入的SIGPROF引起的。(被中断的实际系统调用在我对zmq_recv的调用中很深,但我认为它是哪一个并不重要。)
这是预期的行为吗?我应该以某种方式明确处理这个案件吗?还是这里出了什么问题?
根据zmq_recv()的zeroMQ文档,如果在进行中收到信号,我们可以预期它会返回EINTR
。
在zmq_recv()
调用中间生成信号对于任何测试来说都是一项艰巨的任务。幸运的是,gperftools生成了大量的CCD_;bug";在您的代码中。
当zeroMQ框架优雅地放弃控制时,必须在您的代码中优雅地处理此。重试逻辑可以像修改现有调用一样简单:
/* Block until a message is available to be received from socket */
rc = zmq_recv (socket, &part, 0);
新的(带有重试逻辑)如下:
/* Block until a message is available to be received from socket
* Keep retrying if interrupted by any signal
*/
do {
rc = zmq_recv (socket, &part, 0);
} while(errno == EINTR);
同时在程序中安装一个信号处理程序函数。可以简单地忽略由于SIGPROF
引起的中断并继续重试。
最后,您可能希望处理特定的信号并采取相应的行动。例如,即使用户在程序等待zmq_recv()
时按下CTRL+C,也可以优雅地终止程序。
/* Block until a message is available to be received from socket
* If interrupted by any signal,
* - in handler-code: Check for signal number and update status accordingly.
* - in regular-code: Check for status and retry/exit as appropriate
*/
do {
rc = zmq_recv (socket, &part, 0);
} while(errno == EINTR && status == RETRY);
为了保持代码";"干净";,使用上面的代码段围绕zmq_recv()
编写自己的static inline
函数包装器会更好地为您服务,您可以在程序中调用它。
关于让zmq_recv()
在接收到信号时返回EINTR
的决定,您可能需要查看本文,该文章讨论了从实现角度来看更简单的设计背后的越差越好的哲学。
UPDATE:在zmq_recv()
的上下文中处理信号的文档化代码可在git.locina.net/zeromq examples.git/tree/zmq camera.c中找到。它与上面解释的内容相同,但它看起来经过了很好的测试,可以随时使用,详细的注释随处可见(yayyy zeromq!)。
- 为什么创建服务器后C++ httplib 库阻塞了我的主线程?
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- 为什么io_context在我的boost asio协同程序服务器中丢失
- 为什么我的客户端无法连接到服务器?
- 如何在不使用tensorflow的情况下构建tfsensor并将其提供给我的docker服务器
- 浏览器将随机HTTP消息正文发送到我的boost.asio服务器.我可以更改此设置吗?
- 试图在我的服务器上使用线程
- 我无法在用C++编写的服务器和用 C# 编写的客户端之间建立 UDP 连接
- 我怎么知道我的服务器是否在一段时间内没有连接
- 为什么我的服务器没有等待接收来自客户端的回复
- 为什么BOOST创建的JSON字符串与我的服务器所需的不同
- 为什么我的服务器没有向我的客户端发送任何内容
- 从ESP8266 Arduino连接到我的服务器
- 如何使我的服务器多线程
- SIGPROF在使用谷歌perftools时杀死了我的服务器
- 这是我的服务器
- 如何得到一个距离矩阵的计算正在离线上我的服务器
- 我的服务器退出代码137
- QTcpClient成功连接,但未连接到我的服务器.它在哪里连接
- 将我的服务器响应char数组转换为wchar_t数组是处理客户端收到的服务器消息的正确方法吗?