我有一个客户端gui应用程序,它将定期收到的数据记录到文件中。
每个组件有一个这样的文件,可以有~400个组件。
我原以为这会在软限制范围内,但它达到了极限:
$ grep "Limit\|files" /proc/7469/limits
Limit Soft Limit Hard Limit Units
Max open files 1024 4096 files
$ ls -l /proc/7469/fd | wc -l
1025
显示带有lsof
的打开文件描述符显示实际上每个std::ofstream
打开了8个文件描述符,其中一半似乎与gtk和Qt相关,另一半直接来自我的应用
$ lsof | grep comp1.data
gui_app 7469 steve 746w REG 8,2 99024 1049235 /var/log/gui_app/comp1.data
gui_app 7469 7477 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
QXcbEvent 7469 7480 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
gdbus 7469 7481 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
gmain 7469 7482 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
gui_app 7469 7486 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
QDBusConn 7469 7487 steve 746w REG 8,2 99008 1049235 /var/log/gui_app/comp1.data
gui_app 7469 7490 steve 746w REG 8,2 99024 1049235 /var/log/gui_app/comp1.data
客户端代码中每个ofstream
只有一个引用。
_ofs = std::make_unique<std::ofstream>(_filename, std::ofstream::out | std::ios_base::app | std::ios_base::binary);
我决定在应用程序的持续时间内保持每个文件描述符的打开状态,因为我每秒都写一次,并且做出了(或许是天真的)假设,即每秒打开/关闭400个文件描述符并不是最好的方法。