热门标签 | 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()不会在缓冲区中添加空终止符。


推荐阅读
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社区 版权所有