Отправлять сообщения в программу через командную строку - PullRequest
9 голосов
/ 14 августа 2008

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

./Host --blahblah 3 6 3 5

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

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

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

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

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

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

Ответы [ 6 ]

8 голосов
/ 14 августа 2008

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

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

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

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

5 голосов
/ 14 августа 2008

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

4 голосов
/ 18 августа 2008

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

Взгляните на Руководство Биха по Unix IPC , особенно главу о Unix-сокетах .

1 голос
/ 07 июня 2010

То, что никто не сказал здесь, это: "Вы не можете добраться отсюда".

Командная строка доступна только в том случае, когда она была вызвана.

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

В других ответах предлагаются способы достижения общения.

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

отредактировано для отображения слова fillinthename.

0 голосов
/ 11 августа 2010

Одна из техник, которые я видел, состоит в том, чтобы ваша Host программа была просто «оболочкой» для вашей настоящей программы. Например, когда вы обычно запускаете приложение (например: ./Host), программа превращается в часть «основного приложения» вашего кода. Когда вы запускаете вашу программу способом, который предлагает вам сигнализировать о работающем экземпляре (например: ./Host --send-message restart), программа превращается в часть кода вашего «отправителя сообщения». Это как два приложения в одном. Другой вариант, в котором не используется fork, - это сделать Host просто приложением "отправителя сообщения", а ваше "основное приложение" - отдельным исполняемым файлом (например, Host_core), который Host можно запустить отдельно. 1008 *

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

0 голосов
/ 14 августа 2008

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, он был за что-то еще, но это было не совсем ясно, прежде чем вопрос был отредактирован. Не надо прыгать на мою репутацию ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...