Доброго времени суток. Сабж таков. Есть кусок кода, который сканирует сеть на предмет доступности хостов. Непосредственно за сканирование отвечает класс tracer
Раскрывающийся текст
#ifndef TRACER_H
#define TRACER_H

#include <QString>
#include <QHostAddress>
#include <QProcess>

// класс-трассировщик хостов
class tracer : public QObject
{
    Q_OBJECT

    QString address;   // адрес трассируемого узла    
    QProcess* proc;

public:    
    ~tracer();
    tracer(QString);

private slots:
    void proc_finished(int status);

public slots:
    void trace();

signals:    
    void traced(QHostAddress,quint8);
};
#endif // TRACER_H
Раскрывающийся текст
#include "tracer.h"

#include <QTextCodec>
#include <QTextDecoder>
#include "constants.h"
#include <QProcess>

tracer::tracer(QString s)
{
    address = s;    
}

tracer::~tracer()
{
   // qDebug() << "tracer for " << address <<" deleted";
}

void tracer::trace()
{  
    // создаем процесс
    proc = new QProcess(this);

    // устанавливаем обработчик
    connect(proc,SIGNAL(finished(int)),this,SLOT(proc_finished(int)));

    // запускаем процесс
    proc->start(tr("%1 %2").arg("traceroute").arg(address).toLatin1());
}

// обработчик окончания процесса
void tracer::proc_finished(int status)
{    
    // читаем вывод процесса
    QByteArray data = proc->readAllStandardOutput();

    QString str(data);
    proc->deleteLater();

    qDebug() << str.toLatin1();    

    // анализируем содержимое
    if((str.contains("unreachable"))||(str.contains("недоступен"))||(str.contains("недоступна"))||(str.contains("сбой"))||(str.contains("error"))||(str.contains("Ошибка"))||(str.contains("failure"))||(str.contains("!H")))
        emit traced(QHostAddress(address),(quint8)0);

    else
    {        
        QString crlf = "\n";
        emit traced(QHostAddress(address),(quint8)(str.count(crlf)-1));
    }    
}
Работаю с классом так:
Раскрывающийся текст
for(int iter=1; iter<221; ++iter)
    {  
        QThread *thread = new QThread();  // создаем поток
        tracer *tracert = new tracer(QHostAddress(network+iter).toString()); // создаем трассировщик

        connect(thread,SIGNAL(started()),tracert,SLOT(trace()));
        connect(tracert,SIGNAL(traced(QHostAddress,quint8)),thread,SLOT(quit()));
        connect(tracert,SIGNAL(traced(QHostAddress,quint8)),tracert,SLOT(deleteLater()));
        connect(tracert,SIGNAL(traced(QHostAddress,quint8)),SLOT(addNode(QHostAddress,quint8)),Qt::DirectConnection);

        tracert->moveToThread(thread);  // помещаем трассировщик в поток

        thread->start();  // запускаем поток
    }

На убунте при числе итераций цикла, большем 125 получаю крах с кучей ошибкой вида:
QProcessPrivate::createPipe: Cannot create pipe 0x7f26fc005b18: Too many open files

При числе итераций, меньшем 125, все нормально работает.

На винде все работает вне зависимости от числа итераций (разумеется, если заменить traceroute на tracert).

Подскажите, что это за ограничение и почему оно такое маленькое?

ЗЫ при запуске traceroute из командной строки заметил следующее: если хост недоступен то после вывода утилиты появляется текст pipe N (N - число, которое непонятно от чего зависит, я видел 3 и 4). Если хост трассируется, то никакого сообщения о пайпе не появляется

UPD: погуглил немного, узнал про ограничение на количество одновременно открытых файлов, у меня оно равно что-то около 800000..странно..