1

我在多线程 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;
}
4

0 回答 0