我在多线程 Qt 控制台应用程序中使用 QProcess。在运行时我得到了大约 250 个连接线程,每个连接线程都使用一个 DB 连接并使用 QProcess 对象执行一个 shell 命令。
我的ulimit -n
节目 1024(=管道或文件句柄可用)。我想我在这里达到了极限,改变它只会推迟问题。我需要对此进行适当的错误处理(而不是 SIGBUS 崩溃)。在开始 QProcess 之前,如何检查可用的管道号?
非常感谢您的任何提示。
尖刺
来自 Qt 来源的 qprocess_unix.cpp 引用的代码:
代码在该行崩溃FD_SET(childStartedPipe[0], &fds);
bool QProcessPrivate::waitForStarted(int msecs)
{
Q_Q(QProcess);
#if defined (QPROCESS_DEBUG)
qDebug("QProcessPrivate::waitForStarted(%d) waiting for child to start (fd = %d)", msecs,
childStartedPipe[0]);
#endif
fd_set fds;
FD_ZERO(&fds);
FD_SET(childStartedPipe[0], &fds); // Here I get a SIGBUS fault
if (select_msecs(childStartedPipe[0] + 1, &fds, 0, msecs) == 0) {
processError = QProcess::Timedout;
q->setErrorString(QProcess::tr("Process operation timed out"));
#if defined (QPROCESS_DEBUG)
qDebug("QProcessPrivate::waitForStarted(%d) == false (timed out)", msecs);
#endif
return false;
}
...
这是调用 QProcess 的函数:
void CmdManager::executeCommand() {
shellProcess = new QProcess();
QString cmd = "/bin/ls";
QString argStr = "-lrth *.tmp";
shellProcess->start(cmd,argStr.split(QString(" ")));
bool b= shellProcess->waitForFinished(30000);
if (!b) {
qCritical("ls cmd finishing failed");
shellProcess->close();
shellProcess->terminate();
return;
}
if (shellProcess->exitCode() > 0){
qCritical() << "cmd failed, error msg=" << shellProcess->errorString();
}
QByteArray result = shellProcess->readAllStandardOutput();
QString resultStr = QString(result.data());
qDebug() << "Result=" << resultStr;
shellProcess->close();
shellProcess->terminate();
delete shellProcess;
shellProcess = NULL;
}