マルチスレッド Qt コンソール アプリケーションで QProcess を使用しています。実行時に約 250 の接続スレッドを取得しました。各接続スレッドは DB 接続を使用し、QProcess オブジェクトを使用してシェル コマンドを実行します。
My ulimit -n
show 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;
}