我正在1赫茲的計時器插槽中運行QProcess。該過程旨在喚起Linux命令並解析其輸出。QProcess,無法創建管道
問題是這樣的:節目約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
開頭。我想這是值得一試的。
免費啤酒誰回答了這個:)
您在某處泄漏句柄,或者您同時啓動了太多QProcess-es。看到https://bugreports.qt-project.org/browse/QTBUG-18934 – sashoalm 2013-04-26 13:44:22
這不是你的問題的答案,但如果你的目標是要找出系統中有多少內存是空閒的,我建議完全避免QProcess並使用更輕量級的機制,如fopen(「/ proc/meminfo」,「r」),並直接讀出數據。效率更高,錯誤更少:) – 2013-04-26 14:47:09