QProcess() не всегда работает

Я пытаюсь отформатировать USB-накопитель из Qt, используя mkfs.fat с QProcess(). Проблема в том, что QProcess() вызывается, но иногда завершается без завершения форматирования. Если я читаю exitCode(), это 1.

Это функция:

bool UsbDevice::formatFat(QByteArray name)
{
    QProcess * formatter = new QProcess(this);

    QString partition = baDevice + "1"; // baDevice is "/dev/sdb"
    QString mkfs = "mkfs.fat";

    QStringList args;
    args << "-F32" << "-v" << "-I" << "-n " + name << partition;

    formatter->start(mkfs, args);

    formatter->waitForStarted();

    formatter->waitForFinished(-1);

    emit logLine(formatter->readAll());

    if (formatter->exitCode() == 0)
        {
            emit logLine("mkfs.fat executed correctly.");
        }
    else
        {
            emit logLine(QString("Possible fail to format device (Error: %1).").arg(formatter->errorString()));
        }

    delete formatter;

    return true;
}

Функция работает, если она вызывается 3-5 раз. Я понимаю, что есть больше проблем, чем это (например, эта функция блокирует пользовательский интерфейс из-за функций waitFor*, и одна из них может блокироваться навсегда без тайм-аута), но я не понимаю, почему процесс не завершается Хорошо иногда.

logLine вызывает qDebug, и вывод, когда он не работает, выглядит следующим образом:

mkfs.fat 3.0.27 (2014-11-12)

Possible fail to format device (Error: Unknown error).

Когда он работает, он выводит:

mkfs.fat 3.0.27 (2014-11-12)
/dev/sdb1 has 64 heads and 32 sectors per track,
hidden sectors 0x0800;
logical sector size is 512,
using 0xf8 media descriptor, with 30279937 sectors;
drive number 0x80;
filesystem has 2 32-bit FATs and 16 sectors per cluster.
FAT size is 14771 sectors, and provides 1890647 clusters.
There are 32 reserved sectors.
Volume ID is c35005fb, volume label  USB   .

mkfs.fat executed correctly.

Это заставляет меня думать, что аргументы верны.

Я также пытался подключить сигнал finished() к слоту и блокировать, пока сигнал не будет испущен, но все равно не повезло.


person Cornelius    schedule 30.05.2015    source источник
comment
Можете ли вы попробовать вывод readAllStandardError()?   -  person wimh    schedule 30.05.2015
comment
@Wimmel да, спасибо, я думаю, это решает проблему. Выход /dev/sdb1: No such file or directory. Теперь я должен выяснить, что мешает доступу к /dev/sdb1   -  person Cornelius    schedule 30.05.2015


Ответы (1)


В документации об этом не очень ясно, но похоже, что readAll имеет тот же вывод, что и readAllStandardOutput. Программное обеспечение обычно выводит ошибки в stderr (StandardError), поэтому вам придется вызывать readAllStandardError, чтобы увидеть сообщение об ошибке. Так что в QProcess() нет ничего плохого, просто mkfs.fat не работает.

person wimh    schedule 30.05.2015