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

У меня есть эта программа, назовем ее 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.

Как лучше всего это реализовать?

Ответов (6)

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

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

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

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

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

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

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

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

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

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

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

Здесь никто не сказал: «отсюда нельзя попасть».

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

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

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

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

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

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

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