Отправлять сообщения программе через командную строку
У меня есть эта программа, назовем ее 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)6
Если бы вы работали в 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 .