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

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

./Host --blahblah 3 6 3 5

Это должно как-то в конечном итоге вызвать некоторую функцию в Host

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

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

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

Я должен быть в состоянии сделать это в Linux или Windows. Предпочтительно Linux.

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

13.08.2008 22:40:57
Вы хотите передать аргументы, когда программа уже запущена? Для какой ОС это программируется?
Adam Haile 13.08.2008 22:47:01
6 ОТВЕТОВ

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

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

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

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

-2
13.08.2008 22:52:18

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

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

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

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

9
13.08.2008 22:53:16
+1 Я несколько раз использовал эту методологию именованных каналов, и она работает довольно хорошо. Я также использовал сокеты UNIX для случаев, когда основная программа должна возвращать данные в сценарий / программу командной строки.
jschmier 7.06.2010 15:45:48

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

5
13.08.2008 22:51:30

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

Взгляните на Beej's Guide по Unix IPC , особенно главу о сокетах Unix .

4
18.08.2008 08:55:41

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

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

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

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

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

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

1
7.06.2010 14:55:09

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

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

0
11.08.2010 17:32:45