Отправка сообщений в программу через командную строку
У меня есть программа, назовем ее 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.
Какой самый чистый способ реализовать это?
Если бы вы работали под Windows, я бы посоветовал вам использовать скрытое окно для получения сообщений, но поскольку вы использовали
./
, я предполагаю, что вам нужно что-то на базе Unix.В этом случае я бы выбрал named pipe. У Sun есть учебник об именованных трубах, который может быть полезен.
Программа, вероятно, создаст трубу и будет слушать. Вы можете иметь отдельный сценарий командной строки, который будет открывать трубу и просто передавать в нее аргументы командной строки.
Вы могли бы модифицировать свою программу для поддержки отправки из командной строки вместо использования отдельного сценария. В этом случае вы будете делать то же самое. Ваша программа будет просматривать аргументы командной строки и, если это применимо, открывать трубу для "главного" экземпляра программы и передавать аргументы.
Если он должен быть кросс-платформенным, вы можете рассмотреть возможность заставить запущенный экземпляр прослушивать TCP-порт, а экземпляр, который вы запускаете из командной строки, отправлять сообщение на этот порт.
Я предлагаю использовать либо сокета Unix или D-автобус. Используя сокет может быть быстрее, если вы'знакомы с Unix сокетов в различных языках программирования и хотят только несколько операций, в то время как Д-автобус может сделать его легче сосредоточиться на реализации функциональности в привычной объектно-ориентированный подход.
Взгляните на Beej'руководство к Unix МПК, особенно в главе о сокетов Unix.
Что никто не сказал Вот это: "Вы можете'т получить там от Здесь".
Командной строки доступен только как это было, когда ваша программа была вызвана.
Пример вызова и"fillinthename аргументы ...", чтобы общаться с fillinthename после fillinthename управлением может быть достигнуто только с помощью двух экземпляров программы, которые общаются друг с другом.
Других ответов предложить пути достижения связи.
Ан Амарок как программа должна обнаружить существование другого экземпляра себе для того, чтобы знать, какую роль она должна сыграть главную роль постоянные приемник сообщений/сервер, или незначительные роли одного выстрела отправитель сообщения.
отредактированы, чтобы сделать слова на самом деле fillinthename будет отображаться.
Один метод я видел у
ведущего
только на "Шелл" и для реальной программы. Например, когда вы нормально запустите приложение (например:./Хоста
), программа вилки в графе "приложение" и часть кода. Когда вы запустите вашу программу таким образом, что позволяет предположить, что вы хотите, чтобы сигнал на запуск (напр.:. /Хост-отправить сообщение "рестарт"), программа вилки в графе "отправитель" и часть кода. Это's, как имея два приложения в одном. Другой вариант, который не'т использовать
вилкасделать
хозяиначисто "и отправителя сообщения и" приложение, и вашу "приложение" и как отдельный исполняемый файл (напр:
Host_core`), что "хозяин" может запускать отдельно.В "приложение" по части вашей программы, которые понадобятся для открытия какой-то канал связи для получения сообщений, и "отправителя сообщения и" часть придется подключать на этот канал и использовать его для отправки сообщений. Есть несколько различных вариантов, доступных для отправки сообщений между процессами. Некоторые из наиболее распространенных методов труб и розетки. В зависимости от вашей операционной системы, вы можете иметь дополнительные опции, например, ОС QNX имеет каналы и Беос/Хайку есть BMessages. Вы также можете быть в состоянии найти библиотеку, которая аккуратно оборачивает эту функцию, например НОК.
Возможно, я не понимаю, но по глухому умолчанию главная функция программы на языке Си принимает два аргумента: argc - счетчик количества аргументов (как минимум один) и argv (или вектор аргументов) - список аргументов. Вы можете просто разобрать аргументы и вызвать нужный метод. Например:
выведет все аргументы на экран. Я не гуру языка Си, поэтому надеюсь, что не сделал никаких ошибок.
EDIT: Ок, он хотел что-то другое, но это было не совсем ясно до того, как вопрос был отредактирован. Не надо набрасываться на мою репу...