система — gzip возвращает код ошибки в c ++ при сбое команды?

Фон:
Работая в ubuntu18 env (если это имеет значение), я подделываю тонны больших * .csv файлов в формат Pcap для моего обработчика данных. После завершения конвертации я запускаю «gzip -f» + имя_файла, а затем проверяю, возвращает ли он! 0, тогда я знаю, что это не удалось. Вот код:

if (convert()) {
m_ofs.close();
string command = "gzip -f " + m_out_file_name;
if (system(command.c_str()) != 0) {
const string info{"Cannot execute 'gzip' command, please check if system has installed gzip"};
m_logger->printf("%s\n",info.c_str());
}

Однако на данный момент, когда мой конвертер заканчивает работу, у меня нет способа показать прогресс, и у меня есть ощущение, что некоторые люди остановят конвертер до того, как команда gzip будет завершена (я имею в виду, что конвертирование и ip занимает целый час). каждый файл). Есть ли способ проверить, когда это произойдет, чтобы я мог записать ошибку? Например:

if (convert()) {
m_ofs.close();
string command = "gzip -f " + m_out_file_name;
if (system(command.c_str()) != 0) {

/* EXAMPLE CODE */
if (errno == USER_PRESS_CTR_C){
m_logger->printf("Converter finished but user canceled compression\n");
}
/* EXAMPLE CODE */

const string info{"Cannot execute 'gzip' command, please check if system has installed gzip"};
m_logger->printf("%s\n",info.c_str());
}

Другое слово делает system("gzip -f file"); возвращает любой полезный код ошибки при сбое?

0

Решение

Google-фу предполагает, что он возвращает 0 в случае успеха, 1 в случае неудачи и 2 в случае предупреждения.
Для лучшего сообщения об ошибках рассмотрите вызов библиотеки, которая дает больше информации вместо этого. Эта ссылка может привести вас к жизнеспособный выбор.

4

Другие решения

Вам определенно следует использовать zlib вместо команды gzip, особенно если вы сразу будете читать распакованный файл. Вы обнаружите, что быстрее распаковывать распакованные данные быстрее, потому что это требует гораздо меньше дискового ввода-вывода. (Это особенно верно, если окончательный результат сжат.)

Но, чтобы ответить на ваши вопросы:

  1. В Linux возвращаемое значение system() указывает, была ли команда выполнена успешно или нет. Возвращаемое значение будет:

    • -1 если system не удалось создать процесс для запуска команды.
    • 127, если команда не может быть выполнена (например, потому что исполняемый файл команды не существует)
    • такой же, как возвращаемое значение из wait если команда завершилась нормально (возвращением или вызовом exit), или если это было прекращено сигналом.

Так что довольно легко определить, была ли команда прервана:

int status = system(command);
if (status == 0)
fprintf(stderr, "%s\n", "Command executed successfully");
else if (status == 127)
fprintf(stderr, "%s\n", "Command could not be executed");
else if (WIFSIGNALLED(status) {
if (WSIGTERM(status) == SIGINT)
fprintf(stderr, "%s\n", "Command terminated by interrupt (SIGINT)");
else
fprintf(stderr, "%s\n", "Command terminated by signal %d\n");
}
else
fprintf(stderr, "%s\n", "Command terminated for unknown reason");
  1. Возвращаемое значение из gzip говорит вам, была ли команда выполнена успешно или нет. Смотри выше.
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector