gpt4 book ai didi

c++ - 执行系统命令很慢

转载 作者:行者123 更新时间:2023-11-30 03:06:40 26 4
gpt4 key购买 nike

我有一个 C++ 程序,它长时间连续地向磁盘记录大量数据。因此,我有一个线程来监视可用磁盘空间,一旦它达到一定百分比就会做一些事情。

这是在双四核 x64 CentOS 系统上进行的,录制发生在直接连接的 SATA 磁盘上,这些磁盘仅用于使用 ext3 文件系统进行录制。我通过使用 system() 发出“df”命令并读取结果来监控磁盘使用情况。

昨晚运行它时,我在日志文件中注意到它花了 整整 39 分钟 来运行命令以查找磁盘使用情况。

处理超时的代码是这样的:

int DiskSpaceMonitor::handle_timeout(const ACE_Time_Value& time_, const void* pFunc_)
{
LOG4CXX_TRACE(m_logger, "DiskSpaceMonitor timer fired");

ACE_UINT8 usagePercent = m_diskChecker.getDiskSpaceUsagePercentage(m_monitoredDisk);

m_fileRecorder->notifyDiskUsage(usagePercent);

return 0;
}

调用执行“df”的函数:

ACE_UINT8 DiskSpaceChecker::getDiskSpaceUsagePercentage(std::string diskMountPoint)
{
std::stringstream usageCommand;
usageCommand << "df -PH " << diskMountPoint << " | grep -v \"^Filesystem\" | awk '{print $5}' | cut -d'%' -f1 > " << m_mountSpaceFile;
system(usageCommand.str().c_str());

std::ifstream inFile(m_mountSpaceFile.c_str(), std::ios::in);
if (!inFile)
{
return 0;
}

std::string usageStr;
inFile >> usageStr;
int usage = atoi(usageStr.c_str());

inFile.close();

std::stringstream rmCmd;
rmCmd << "rm " << m_mountSpaceFile;
system(rmCmd.str().c_str());

LOG4CXX_DEBUG(m_logger, "Disk usage for disk: " << diskMountPoint << " = " << usage << "%");

return usage;
}

所以在 handle_timeout() 中的跟踪日志记录语句和 getDiskSpaceUsagePercentage() 中的调试跟踪语句之间耗时 39 分钟。但延迟确实发生在 inFile >> usageStr; 之前(因为我可以看到读取百分比高于预期 - 它应该上升 1% 或更少,但它跃升超过 16%) .

为什么运行命令和读取它的处理要花费如此大量的时间?

现在我承认磁盘在写入时确实会受到一点冲击,但只有一个程序正在写入它们,并且它只写入一个数据文件和一个索引文件。所以我不明白这怎么会花这么长时间。

作为替代方案,是否有一种简单的方法可以调用 system() 函数,如果花费的时间太长,让它在超时后返回?

最佳答案

使用 system 的替代方法是特定于操作系统的 API 调用,例如 statvfs .

但我同意花这么长时间很奇怪。你能重新创建这个吗?

关于c++ - 执行系统命令很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6382913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com