1 std :: ofstream = 8个文件描述符?

时间:2016-06-09 18:37:13

标签: c++ linux qt gtk ofstream

我有一个客户端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个文件描述符并不是最好的方法。

问题:

  • 所有额外的文件描述符是什么?
  • 有没有什么方法可以在不需要每次关闭/重新打开文件描述符的情况下减少数字?
  • 打开fd,写入,关闭400个不同文件的fd,每秒一次,是否可行?

0 个答案:

没有答案