1

マルチスレッド Qt コンソール アプリケーションで QProcess を使用しています。実行時に約 250 の接続スレッドを取得しました。各接続スレッドは DB 接続を使用し、QProcess オブジェクトを使用してシェル コマンドを実行します。

My ulimit -nshow 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