C fwrite() 卡在 cpu 100%
C fwrite() stuck cpu at 100%
我有一台主控PC和多个从属网络设备。 master 使用 fork 为每个 slave 创建一个进程。每个进程都尝试连接到正确的设备并通过 TCP 捕获数据。
一切正常,但我在 master 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?
}
当您收到 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。
如果套接字是 non-blocking,read()
可以 return -1
和 ERRNO == EWOULDBLOCK
当没有准备好读取时。您需要对此进行检查并跳出循环(使用 select()
或 epoll()
等待套接字准备就绪,然后再尝试从中读取)。
顺便说一句,您不应该使用 printf()
,因为 read()
不会向缓冲区添加空终止符。
我有一台主控PC和多个从属网络设备。 master 使用 fork 为每个 slave 创建一个进程。每个进程都尝试连接到正确的设备并通过 TCP 捕获数据。
一切正常,但我在 master 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?
}
当您收到 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。
如果套接字是 non-blocking,read()
可以 return -1
和 ERRNO == EWOULDBLOCK
当没有准备好读取时。您需要对此进行检查并跳出循环(使用 select()
或 epoll()
等待套接字准备就绪,然后再尝试从中读取)。
顺便说一句,您不应该使用 printf()
,因为 read()
不会向缓冲区添加空终止符。