Вопросы | c

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

Вопрос

andrewrk | 2199 просмотров | рейтинг: 0

У меня есть эта программа, мы назовем ее 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. Какой самый чистый способ реализовать это?

Комментарии:

Adam Haile

Вы хотите передать аргументы, когда программа уже запущена? Для какой ОС это программируется?




Ответы

Stu

+ -2 -
Так что, возможно, я здесь упускаю суть, но по умолчанию основная функция программы на С принимает два аргумента; 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, поэтому я надеюсь, что не сделал никаких ошибок. РЕДАКТИРОВАТЬ: Хорошо, он был за что-то еще, но это было не очень понятно, прежде чем вопрос был отредактирован. Не надо прыгать на мою репутацию ...  


Derek Park

+ 8 -
Если бы вы работали в Windows, я бы посоветовал вам использовать скрытое окно для получения сообщений, но, поскольку вы использовали ./, я предполагаю, что вы хотите что-то на основе Unix. В этом случае я бы пошел с именованным каналом. У Sun есть учебник по именованным каналам, который может быть полезен. Программа, вероятно, создаст канал и прослушает. Вы можете иметь отдельный сценарий командной строки, который откроет канал и просто отобразит в нем аргументы командной строки. Вы можете изменить свою программу для поддержки отправки из командной строки вместо использования отдельного скрипта. Вы бы сделали то же самое в этом случае. Ваша программа будет просматривать аргументы командной строки и, если применимо, открывать канал для основного экземпляра программы и отправлять аргументы через него.  


Ted Percival

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


Ed S.

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


bta

+ 0 -
Одна из техник, которые я видел, состоит в том, чтобы ваша программа Host была просто оболочкой для вашей настоящей программы. Например, когда вы обычно запускаете свое приложение (например, ./Host), программа превращается в основную часть приложения вашего кода. Когда вы запускаете вашу программу способом, который предлагает вам сигнализировать о работающем экземпляре (например: ./Host --send-message restart), программа будет преобразована в часть кода вашего отправителя сообщений. , Это как два приложения в одном. Другой вариант, который не использует fork, состоит в том, чтобы сделать Host чисто приложением отправителя сообщения и сделать ваше основное приложение отдельным исполняемым файлом (например, Host_core ) этот Host может запускаться отдельно. Основная часть приложения вашей программы должна будет открыть какой-то канал связи для приема сообщений, а часть отправителя сообщений должна будет подключиться к этому каналу и использовать его для отправки сообщений. Существует несколько различных вариантов отправки сообщений между процессами. Некоторые из наиболее распространенных методов - это трубы и розетки. В зависимости от вашей ОС у вас могут быть доступны дополнительные опции; например, в QNX есть каналы, а в BeOS / Haiku - BMessages. Вы также можете найти библиотеку, которая аккуратно оборачивает эту функциональность, например lcm.


Теги

c | architecture | command-line | io