Отправка сообщений в программу через командную строку

У меня есть программа, назовем ее Host. Host делает всевозможные полезные вещи, но ей нужно иметь возможность принимать ввод через командную строку в то время, когда она запущена. Это означает, что он должен каким-то образом посылать данные другому процессу, а затем завершать работу. Например, мне нужно иметь возможность сделать следующее:

./Host --blahblah 3 6 3 5

Это должно каким-то образом заканчиваться вызовом некоторой функции в Host под названием

handleBlahBlah(int x1, int y1, int x2, int y2){
  //do some more sweet stuff
}

Host - это программа на языке C, и ей не нужно поддерживать несколько экземпляров.

Примером может служить музыкальный плеер Amarok. Когда Amarok запущен и играет, вы можете набрать "amarok --pause", и он приостановит музыку.

Мне нужно иметь возможность делать это в Linux или Windows. Предпочтительнее Linux.

Какой самый чистый способ реализовать это?

Комментарии к вопросу (1)

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

В этом случае я бы выбрал named pipe. У Sun есть учебник об именованных трубах, который может быть полезен.

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

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

Комментарии (1)

Если он должен быть кросс-платформенным, вы можете рассмотреть возможность заставить запущенный экземпляр прослушивать TCP-порт, а экземпляр, который вы запускаете из командной строки, отправлять сообщение на этот порт.

Комментарии (0)

Я предлагаю использовать либо сокета Unix или D-автобус. Используя сокет может быть быстрее, если вы'знакомы с Unix сокетов в различных языках программирования и хотят только несколько операций, в то время как Д-автобус может сделать его легче сосредоточиться на реализации функциональности в привычной объектно-ориентированный подход.

Взгляните на Beej'руководство к Unix МПК, особенно в главе о сокетов Unix.

Комментарии (0)

Что никто не сказал Вот это: "Вы можете'т получить там от Здесь".

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

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

Других ответов предложить пути достижения связи.

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

отредактированы, чтобы сделать слова на самом деле fillinthename будет отображаться.

Комментарии (0)

Один метод я видел у ведущего только на "Шелл" и для реальной программы. Например, когда вы нормально запустите приложение (например: ./Хоста), программа вилки в графе "приложение" и часть кода. Когда вы запустите вашу программу таким образом, что позволяет предположить, что вы хотите, чтобы сигнал на запуск (напр.:. /Хост-отправить сообщение "рестарт"), программа вилки в графе "отправитель" и часть кода. Это's, как имея два приложения в одном. Другой вариант, который не'т использоватьвилкасделатьхозяиначисто "и отправителя сообщения и" приложение, и вашу "приложение" и как отдельный исполняемый файл (напр:Host_core`), что "хозяин" может запускать отдельно.

В "приложение" по части вашей программы, которые понадобятся для открытия какой-то канал связи для получения сообщений, и "отправителя сообщения и" часть придется подключать на этот канал и использовать его для отправки сообщений. Есть несколько различных вариантов, доступных для отправки сообщений между процессами. Некоторые из наиболее распространенных методов труб и розетки. В зависимости от вашей операционной системы, вы можете иметь дополнительные опции, например, ОС QNX имеет каналы и Беос/Хайку есть BMessages. Вы также можете быть в состоянии найти библиотеку, которая аккуратно оборачивает эту функцию, например НОК.

Комментарии (0)

Возможно, я не понимаю, но по глухому умолчанию главная функция программы на языке Си принимает два аргумента: argc - счетчик количества аргументов (как минимум один) и argv (или вектор аргументов) - список аргументов. Вы можете просто разобрать аргументы и вызвать нужный метод. Например:

 int main(int argc, *argv[])
 {
     /*loop through each argument and take action*/
      while (--argc > 0)
      {
           printf(%s%s, *++argv, (argc > 1) ? " " : "");
      }
 } 

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

EDIT: Ок, он хотел что-то другое, но это было не совсем ясно до того, как вопрос был отредактирован. Не надо набрасываться на мою репу...

Комментарии (0)