我在 1 Hz 的计时器槽中运行 QProcess。该过程旨在调用 Linux 命令并解析其输出。
问题是这样的:程序运行大约 20 分钟后,我收到此错误:
QProcessPrivate::createPipe: Cannot create pipe 0x104c0a8: Too many open files
QSocketNotifier: Invalid socket specified
理想情况下,该程序将在系统的整个正常运行时间内运行,可能是几天或几周。
我想我通过阅读示例对过程控制很小心,但也许我错过了一些东西。我使用了来自 Qt 网站的示例,它们使用的代码与我编写的代码相同,但这些代码是为一次性使用而设计的,而不是数千个。这是一个最小的例子:
class UsageStatistics : public QObject {
Q_OBJECT
public:
UsageStatistics() : process(new QProcess) {
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(getMemoryUsage()));
timer->start(1000); // one second
}
virtual ~UsageStatistics() {}
public slots:
void getMemoryUsage() {
process->start("/usr/bin/free");
if (!process->waitForFinished()) {
// error processing
}
QByteArray result = process->realAll();
// parse result
// edit, I added these
process->closeReadChannel(QProcess::StandardOutput);
process->closeReadChannel(QProcess::StandardError);
process->closeWriteChannel();
process->close();
}
}
我还尝试deleting
在函数末尾手动处理进程指针,然后new
在开始时尝试。我想这值得一试。
回答这个问题的人可以免费喝啤酒:)