2013-08-04 3 views
0

Когда я запускаю приложение через консоль, например, $application start, как я могу связаться с указанным приложением? Поэтому я могу, например, сделать $application load --/home/application/files/file.txt --warn=0 --notice=0, и этот исполняемый экземпляр приложения будет реагировать на это ...Как связаться с программой через консоль/C++

Я не хочу продолжать слушать консоль со стороны приложения. Я хочу иметь возможность закрыть консоль, снова открыть ее и по-прежнему взаимодействовать с программой.

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

У меня есть опыт работы с PHP, и я знаю, что у Apache такое поведение.

EDIT: После нескольких замечаний вас, ребята, я пришел к выводу, что мне необходимо использовать IPC. Я слышал об этом раньше, но я никогда не понимал, как это работает. После некоторых ссылок в Googling и WikiPedia, которые вы показали мне, я пришел к выводу, что существует несколько способов обращения с IPC. Я хочу отправить пакеты данных в основной процесс, который был бы лучшим в моем случае? Мой личный любимый atm - очередь сообщений, но, похоже, работает только в одном процессе.

+0

Какая операционная система? –

+0

Linux, желательно как можно больше дистрибутивов. Я использую Ubuntu, но он нацелен на версии сервера. –

+2

Слишком много возможных ответов. См. [Inter-Process Communication (IPC)] (http://en.wikipedia.org/wiki/Inter-process_communication) для начала работы. –

ответ

1

, чтобы иметь возможность запустить приложение в фоновом режиме и иметь возможность закрыть консоль, где она была запущена, вы можете использовать утилиту nohup. то первый экземпляр вашего приложения должен создать некоторый («хорошо известный») ресурс IPC (очередь сообщений, FIFO, что угодно), поэтому дальнейшие экземпляры будут связываться с ним с первым экземпляром.

и будет относительно легко, а затем превратить ваше приложение в полноценный функционал daemon.

1

Поскольку @LokiAstari указал, что у вас может не быть большого опыта работы с C++, я бы рекомендовал вам прочитать: How to parse command line parameters.

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

+0

Я знаю, как разбирать командную строку, и мне понадобится это, чтобы отправить сигнал в основной экземпляр программы. Мой вопрос был в том, как мне получить этот сигнал. –

+1

См. Редактирование, которое я только что сделал. –

+0

Итак, это будет называться «Именованная труба»? –

0

Лично я сделал бы это в несколько этапов.
В противном случае вы будете пытаться решить сразу несколько разных проблем.

Что вы делаете, это написать службу (приложение с большим сроком действия). Коммуникация с сервисом при запуске команды обычно включает запуск другого приложения, которое ведет переговоры с службой (в случае апачей команда apache запускает услугу httpd. Затем последующие команды разговаривают с службой httpd).

Но для того, чтобы начать работу, сначала сначала пройти несколько шагов.

  1. Напишите приложение, которое при запуске команды чтения из каталога
    : Итак, на старте у вас есть каталог команды.
    : вы открываете каждый файл (чтобы выполнить файл, если он действителен), затем переименуйте файл, чтобы показать, что это было сделано.

  2. Измените приложение, чтобы работать как непрерывный цикл. Вся петля выполняет поиск событий в очереди заданий.
    : если он видит, что они выполняют задание.
    : Если там нет работы, тогда спать в течение 10 секунд.
    : При запуске вы просто вводите одно задание
    ->: Он читает каталог команд и создает задание для каждого файла.
    ->: Задание файла выполняет файл, а затем переименовывает файл, чтобы показать, что все сделано.

  3. Измените свою службу, чтобы использовать нарезку.
    : Запустите цикл событий в одном потоке.
    : Используйте блокировки и семафоры, чтобы добавленные элементы в очередь были потокобезопасными.
    : При запуске приложения вы запускаете цикл обработки событий (убедившись, что он начал затем впрыснуть работу (как в 2) Тогда просто ждет цикл обработки событий, чтобы закончить (не будет)

  4. Добавить.. таймер, который запускает очень много секунд, чтобы проверить каталог команд
    : Все, что должен сделать таймер, это создать задание и поместить его в очередь событий.
    : Теперь вам не нужно вводить задание при запуске его таймеров

  5. После того, как у вас есть все вышеперечисленное, вы готовы представить слушателя, который будет прослушивать сокет для косвенных команд из другого приложения заревой.
    : Выполнение всего вышеперечисленного за один проход для запуска службы будет долгой ошибкой для новичков. Я советую вам пройти все эти шаги, чтобы добраться до этого состояния, а затем задать другой вопрос о том, как сделать IPC.
    : Итак, добавьте новый поток, который прослушивает сокет (это не лучший метод, но это загрузочный новичок). Когда он получает вход, он создает файл в каталоге команд, затем помещает задание в очередь заданий.

  6. Теперь вы должны проверить свою команду с помощью командной строки curl (или wget) для отправки файлов в вашу службу.

  7. После того, как вы работаете с curl.
    Вы можете написать отдельное приложение, которое преобразует аргументы командной строки в командные файлы и отправляет их в вашу службу.

  8. Конвертировать приложение из файлов, чтобы иметь всю информацию в объекте задания.

  9. Thats it.

+0

Я знаю, как в i/o из файла, и у меня есть опыт работы с таймерами Boost. Я могу в значительной степени написать это прямо сейчас, но я не знаю, как, например, получить код ответа. –

+0

Что вы подразумеваете под кодом ответа? –

+0

Консольное приложение -> Файл -> Основной процесс Как перейти от Главного процесса -> Консольное приложение (ответьте на команду) –