热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Cfwrite()将CPU卡在100%

如何解决《Cfwrite()将CPU卡在100%》经验,为你挑选了1个好方法。

我有一台主PC和多个从属网络设备。主服务器使用fork为每个从服务器创建一个进程。每个进程都尝试连接到适当的设备并通过TCP捕获数据。

一切正常,但是我在主ubuntu-> kali(4.19.0-kali1-amd64)上重新安装,并且数据捕获停止

输入数据应在10-40Mb / s之间

分叉,从属和数据捕获似乎很好。如我所见,问题是fwrite。

如果我将fwrite更改为printf并将数据重定向到文件中,那么我将获取捕获的数据。

调试后有趣的注意事项:

一个线程的CPU总是100%

始终捕获16K数据

使用printf而不是fwrite,一切都很好。

还有一个有趣的注意事项:我认为这是一个不同的问题,但是我的网络界面看不到传入的软件包。已捕获,但不能用于netstat之类的统计信息。

while(1)
      {
        valread = read( sock , buffer, 1024); //blocking
        //printf("%s",buffer); //try with printf
        if (valread > 0)
        fwrite(buffer,1,valread,fp); //stuck?
      }

Barmar.. 5

当您收到EOF或错误时,循环不会停止,而只是继续尝试从套接字读取。

while(1)
{
    valread = read( sock , buffer, 1024);
    if (valread > 0) {
        fwrite(buffer,1,valread,fp);
    } else if (valread <0) {
        perror("read from sock");
        break;
    } else {
        break;
    }
}

设备关闭网络连接时,将发生EOF。

如果套接字是非阻塞的,read()可以返回-1ERRNO == EWOULDBLOCK当没有什么随时阅读。您需要检查并打破循环(使用select()epoll()等待套接字准备就绪,然后再尝试从中进行读取)。

顺便说一句,您不应使用printf(),因为read()不会在缓冲区中添加空终止符。



1> Barmar..:

当您收到EOF或错误时,循环不会停止,而只是继续尝试从套接字读取。

while(1)
{
    valread = read( sock , buffer, 1024);
    if (valread > 0) {
        fwrite(buffer,1,valread,fp);
    } else if (valread <0) {
        perror("read from sock");
        break;
    } else {
        break;
    }
}

设备关闭网络连接时,将发生EOF。

如果套接字是非阻塞的,read()可以返回-1ERRNO == EWOULDBLOCK当没有什么随时阅读。您需要检查并打破循环(使用select()epoll()等待套接字准备就绪,然后再尝试从中进行读取)。

顺便说一句,您不应使用printf(),因为read()不会在缓冲区中添加空终止符。


推荐阅读
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • NanoPi2 使用体验深入解析(续篇)
    随着Raspberry Pi的问世,开源硬件领域迎来了前所未有的发展,激发了全球范围内的创新热潮。在中国,这一趋势同样催生了一系列类似的开发板,例如NanoPi 2。本文作为前篇的延续,将深入探讨NanoPi 2的实际使用体验,从性能、兼容性到应用场景,进行全面分析。 ... [详细]
  • 在服务器管理和大规模操作中,常需将系统状态或执行结果通过电子邮件通知相关人员。本文详细介绍了如何利用Linux自带的命令行工具高效地通过SMTP协议发送邮件,提供了一种快速便捷的解决方案。 ... [详细]
  • 本文详细介绍如何在忘记MySQL服务器密码的情况下进行密码重置,包括具体的步骤和注意事项。 ... [详细]
  • 阿里云服务器搭建详解——Ubuntu
    由于自己电脑配置跟不上,双系统一开,整个电脑就会变得非常卡顿,所以决定在阿里云买一个云服务器。听朋友说,学生买的话是非常便宜 ... [详细]
  • 操作系统如何通过进程控制块管理进程
    本文详细介绍了操作系统如何通过进程控制块(PCB)来管理和控制进程。PCB是操作系统感知进程存在的重要数据结构,包含了进程的标识符、状态、资源清单等关键信息。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • FreeBSD环境下PHP GD库安装问题的详细解决方案
    在 FreeBSD 环境下,安装 PHP GD 库时可能会遇到一些常见的问题。本文详细介绍了从配置到编译的完整步骤,包括解决依赖关系、配置选项以及常见错误的处理方法。通过这些详细的指导,开发者可以顺利地在 FreeBSD 上完成 PHP GD 库的安装,确保其正常运行。此外,本文还提供了一些优化建议,帮助提高安装过程的效率和稳定性。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • 技术日志:Ansible的安装及模块管理详解 ... [详细]
author-avatar
桔梗的坚守
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有