Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: C++ system() возвращает бред. Чем ловить код завершения внеш. програм.? [РЕШЕНО]  (Прочитано 752 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
Доброе время суток!
Столкнулся с проблемой, при вызове внешней программы через "system()", в ответ получаю "-1" при любом раскладе. Для примера,
делаю так:
int return_val(system("ping -q -c3 8.8.8.8 >>/dev/null"))Получаю в ответ return_val = -1, хотя если выполнить
ping -q -c3 8.8.8.8 >>/dev/null; echo $?))То ответ = 0, т.е. все хорошо.

Делаю тоже самое только без подключения к интернету:
int return_val(system("ping -q -c3 8.8.8.8 >>/dev/null"))Получаю в ответ return_val = -1, выполняю
ping -q -c3 8.8.8.8 >>/dev/null; echo $?))ответ = 1, т.е. ошибка.

С другими приложениями вызванными через system(), та же фигня. Пробовал получить ответ через "popen", тоже ничего внятного, возвращает не код завершения вызванной программы, а последнее что эта программа выводила на консоль. Ну это я ожидал, решил просто проверить.

Так же пробовал через execl, тут тоже не получилось получить ничего вразумительного. Подскажите как кто ловит код возврата, буду очень благодарен!


Другим в помощь!
Если использовать system() и указывать signal(SIGCHLD, SIG_IGN), то system() постоянно будет возвращать -1
Мое решение вопроса снизу.
« Последнее редактирование: 09 Февраль 2016, 17:44:35 от Vlad.V »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 1801
    • Просмотр профиля
А что делает эта return_val()? Если только принимает и возвращает результат от system(), то дожно работать.
У меня system() работает правильно, я когда-то специально проверял и сейчас посмотрел, работает.
Пётр.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
return_val это просто объект, который ловит возвращаемое system() значение. У меня тоже вроде работало, а вот теперь не могу ничего понять. Раньше возвращало 0 или код ошибки, то есть в любом случае если return_val != 0, это ошибка, а сейчас бред. Я раньше читал,что народ не рекомендует использовать system(), но не придавал этому внимания. Но как по другому вызывать программы и ловить их код, что-то не пойму

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1474
  • ubuntu 18.04
    • Просмотр профиля
Vlad.V,
делай нормальный вызов программы без башевой ерунды
ping -q -c3 8.8.8.8

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7083
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Vlad.V,
Цитировать
int return_val(system("ping -q -c3 8.8.8.8 >>/dev/null"))
делает
sh -c ping -q -c3 8.8.8.8 >>/dev/null

Проверяй, что у тебя с sh. У меня
#include <iostream>
#include <stdlib.h>
int main()
{
    std::cout<<system("ping -q -c3 8.8.8.8 >>/dev/null")<<std::endl;
    return 0;
}
Даёт 0. А у тебя?
И да, это не код возврата приложения, это -1 когда fork не удался, читай тут.

Оффлайн Vlad.V

  • Автор темы
  • Активист
  • *
  • Сообщений: 478
    • Просмотр профиля
не помогло ((
Вот что интересно, создал другую программу, все что она делает, это вызывает пинг через system() и возвращает ответ. Так вот эта программа показывает 0, если ошибок нет или код ошибки, разные были 512,256,2 но -1 не было. Запускаю программу в которой у меня показывает -1, делаю такой же модуль с пингом, в самом начале из main вызывается ping() и возвращает -1!!! При любом раскладе -1, что за нафиг?! У кого есть знакомый экзорцист??

Пользователь решил продолжить мысль [time]09 Февраль 2016, 18:00:23[/time]:
Спасибо Вам огромное peregrine!!!!
Я бы сам еще долго думал что за хрень!!!
А хрень эта выглядит вот так "signal(SIGCHLD, SIG_IGN);", а system(), как я понял, юзает fork(). Ну блин ваще, 4 день бьюсь... СПАСИБО!

Глюк нашел, теперь нужно понять как совместно использовать signal(SIGCHLD, SIG_IGN); и system() ибо нужно и то и другое.

Пользователь решил продолжить мысль 09 Февраль 2016, 17:43:44:
Решение моей проблемы:
Для теста:
int system(string &cmd)
{
    signal(SIGCHLD, SIG_DFL);
    int rv(system(cmd.c_str()));
   
    std::cout << cmd << " return "<< rv << "\n";
    return rv;
}

Для работы:
int system(string &cmd)
{
    signal(SIGCHLD, SIG_DFL);
    return(system(cmd.c_str()));
}
« Последнее редактирование: 09 Февраль 2016, 17:43:44 от Vlad.V »

 

Страница сгенерирована за 0.059 секунд. Запросов: 24.