singlepost

ANSI C << На главную или назад  

Всем привет! Я только начинаю работать в сабже, до этого все больше VB.NET, php… Вот, собственно, такой вопрос – как в сабже выполнить консольную команду в фоновом режиме и считать первую вернувшуюся строку? Если более конкретно – надо получить адрес первого узла при трассировке любого ip. То есть выполнить команду, к примеру, tracert ya.ru и, как только получена первая строка с ip-адресом ближайшего узла, прекратить выполнение команды, а полученные данные сохранить в буфере для последующей работы. Да, буду крайне признателен, если скажете, где можно почитать маны по работе с консолью из сабжа.

27 ответов в теме “ANSI C”

  1. 14
    Петр Рогов ответил:

    Роман Me llamo Román Чваников
    >Петр Рогов, далеко не всегда, к сожалению, таблица маршрутизации даст >верный результат, именно тот, который мне нужен. Да и искать то все >равно пришлось бы – что route print, что tracert…

    Вы не правы. Таблица маршрутизации всегда даст точный ответ на какой адрес через какой шлюз будут отправляться пакеты. А "route print" я не предлагал использовать, я предлагал программно получить всю таблицу маршрутизации через соответствующий API.

  2. 13
    Тимур Магомедов ответил:

    >>>Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет

    >fprintf(stdout, …);

    Не очень понятно, что имелось в виду под fprintf(stdout, ..), как родительский процесс узнает, что вывел потомок? В юниксах это реализуется системными вызовами pipe и dup2. Некоторое время назад специально искал, как в windows реализовать эту функциональность- все, что нашел это вот эта статья-пример с RSDN://rsdn.ru/article/files/progs/inetd.xml

  3. 12
    Кирилл Быков ответил:

    Не за что. Слежу за темой, отпишись, получилось или нет.

  4. 11
    Роман Чваников ответил:

    Всем спасибо за комментарии.

    Денис GooDWiN Гублин, если бы инструмент не был бы важен – я бы делал все через vb.net где хоть что то понимаю… Ну или c#.NET – не столь уж сильно они отличаются.

    Петр Рогов, далеко не всегда, к сожалению, таблица маршрутизации даст верный результат, именно тот, который мне нужен. Да и искать то все равно пришлось бы – что route print, что tracert…
    Переносимость – не главная моя задача, можно использовать WinApi

    Денис "Марсианин" Лисов
    >>извлекать адрес просто как последнее поле в нужной строке.

    кстати, возможно Вы и правы, несмотря на неизящность такого решения, действительно нужный мне IP-адрес находится в конце 5й строки в квадратных скобках…
    >>Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет

    fprintf(stdout, …);

    А библиотеку для работы с регулярками не посоветуете?

    Евгений Raison_d'être Тюкавкин
    Писать библиотеку для сравнения с регэксп-шаблоном? Нуу… Я всего лишь новичек тут, пока что это, думаю, не для меня…

    Кирилл Быков
    Спасибо, гляну… Когда последний раз отвечал – сильно хотел спать, так и не спросил у гугла, "шо цэ такэ pipe" =)

  5. 10
    Денис Гублин ответил:

    простите-извините, я понимаю, что комментарий мой не ценен и "дурной тон", но попробуйте обратить внимание на WSH с его JScript и VBScript, если инструмент не важен. Специально предназначены для решения подбного рода задач, может, там вдруг окажется проще? Еще раз простите.

  6. 9
    Петр Рогов ответил:

    Еще вопрос применительно к задаче (я понимаю, что суть вопроса автора в другом, но все-таки…). Первый узел при трассировке – это обычно шлюз по-умолчанию. Не проще ли его извлечь откуда-то еще? В конце-концов посмотреть таблицу маршрутов? По этому поводу можно посмотреть вот тут: //msdn.microsoft.com/en-us/library/aa374013(VS.85).aspx а также рядом там весь это API, пишут что он доступен начиная с Windows 2000.

  7. 8
    Петр Рогов ответил:

    я уточню – WinAPI использовать можно или должна быть переносимость?
    Если можно, то, по-моему, можно через CreateProcess и смежные функции добиться подобного функционала, надо почитать MSDN. Помню точно что где-то видел реализацию подобного на C, но не могу вспомнить точно

  8. 7
    Денис Лисов ответил:

    Роман Me llamo Román Чваников, стандартная библиотека ANSI C регулярные выражения не включает. Хотите работать с ними – берите отдельные библиотеки. По мне так проще использовать опцию -d и извлекать адрес просто как последнее поле в нужной строке.

    Считать выводной поток программы? По-моему, ANSI C, опять-таки, этого не позволяет. Перенаправить во временный файл и считать его?

  9. 6
    Евгений Тюкавкин ответил:

    Может будет проще разобраться с принципом работы tracert и написать свою реализацию? Или встроить в свою программу уже готовый код.
    C/C++ сами по себе со строками практически не умееют работать. Проверку регэкспу нужно писать самому либо брать готовую библиотеку.

    Если требуется получить данные из вывода другой программы, то с помощью popen или подобной функции запускается нужная команда, а с ее выводом работа идет как с файлом.

  10. 5
    Кирилл Быков ответил:

    В ансицэ ничего не подскажу. В стандартах не силён. Загугли pipe и fifo, возможно, в винде есть поддержка таких вещей, а если повезёт, то и хорошая поддержка, с возможностью перенаправлять туда консольный вывод. В таком случае, можно и первую строчку выловить. А если нет, то перенаправлять в файл и следить, когда там эта строчка появится.

  11. 4
    Роман Чваников ответил:

    Перенаправление в файл не нужно – мне в приложении надо с этими данными работать. А второе – может поясните? Я сталкивался с термином pipe, однако в несколько иных контекстах – при работе с соединениями, базами данных вроде…

  12. 3
    Роман Чваников ответил:

    Да, кстати, был крайне удивлен, когда ничего толком не нашел в гугле по использованию регулярок в сабже. Нашел кучу примеров на C++, однако я с ним никогда раньше не работал, поэтому не уверен, что смогу транслировать в анси си (хотя честно даже попытался разобраться…)
    Быть может, подскажете, каким образом можно проверить char[] на соответствие регэкспу?

  13. 2
    Кирилл Быков ответил:

    Возможно, можно как-нибудь перенаправить вывод, например, в какой-нибудь файл или pipe.

  14. 1
    Роман Чваников ответил:

    Так… Научился запускать трассировку из приложения – system("tracert ya.ru");
    но вот теперь задача повеселее для новичка – запуск должен быть незаметным, а потом еще и ip выбрать из кучи символов… Надеюсь, это можно будет решить с помощью регулярок :) А пока остро стоит вопрос о запуске в фоновом режиме…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.