У меня есть эта программа, мы назовем ее 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.
Какой самый чистый способ реализовать это?
Таким образом, я могу здесь упустить момент, но по умолчанию главная функция программы на С принимает два аргумента; 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, поэтому я надеюсь, что не сделал никаких ошибок.
РЕДАКТИРОВАТЬ: Хорошо, он был за что-то еще, но это было не очень понятно, прежде чем вопрос был отредактирован. Не надо прыгать на мою репутацию ...
Если бы вы работали в Windows, я бы посоветовал вам использовать скрытое окно для получения сообщений, но так как вы использовали ./
, я предполагаю, что вы хотите что-то на основе Unix.
В этом случае я бы пошел с именованным каналом . У Sun есть учебник по именованным каналам, который может быть полезен.
Программа, вероятно, создаст канал и будет слушать. Вы можете иметь отдельный скрипт командной строки, который откроет канал и просто отобразит в нем аргументы командной строки.
Вы можете изменить свою программу для поддержки отправки из командной строки вместо использования отдельного скрипта. Вы бы сделали то же самое в этом случае. Ваша программа будет просматривать аргументы командной строки и, если применимо, открывать канал к «главному» экземпляру программы и отправлять аргументы через него.
Если он должен быть кроссплатформенным, вы можете подумать о том, чтобы заставить работающий экземпляр прослушивать порт TCP, и чтобы экземпляр, который вы запускаете из командной строки, отправлял сообщение на этот порт.
Я предлагаю использовать либо Unix-сокет, либо D-Bus . Использование сокета может быть быстрее, если вы знакомы с программированием сокетов Unix и хотите всего лишь несколько операций, тогда как D-Bus может упростить концентрацию на реализации функциональности знакомым объектно-ориентированным способом.
Взгляните на Beej's Guide по Unix IPC , особенно главу о сокетах Unix .
То, что никто не сказал здесь, это: «Вы не можете добраться отсюда».
Командная строка доступна только в том случае, когда она была вызвана.
Пример вызова « аргументов fillinthename ...» для связи с fillinthename после запуска fillinthename может быть выполнен только с использованием двух экземпляров программы, которые взаимодействуют друг с другом.
Другие ответы предлагают способы достижения общения.
Amarok как программа должна обнаружить существование другого экземпляра себя, чтобы знать , какую роль она должна играть, главную роль постоянного сообщения приемника / сервера, или второстепенную роль одного выстрела отправителя сообщения.
отредактировано, чтобы слово fillinthename действительно отображалось.
Одна техника, которую я видел, состоит в том, чтобы ваша Host
программа была просто «оболочкой» для вашей настоящей программы. Например, когда вы обычно запускаете свое приложение (например:) ./Host
, программа превращается в часть «основного приложения» вашего кода. Когда вы запускаете вашу программу таким образом, который предлагает вам сигнализировать о работающем экземпляре (например:) ./Host --send-message restart
, программа превращается в часть кода вашего «отправителя сообщения». Это как два приложения в одном. Другой вариант, который не используется, fork
- сделать Host
приложение «отправителем сообщения» и создать «основное приложение» в виде отдельного исполняемого файла (например, Host_core
), который Host
можно запускать отдельно.
Часть «основного приложения» вашей программы должна будет открыть какой-то канал связи для приема сообщений, а часть «отправитель сообщения» должна будет подключиться к этому каналу и использовать его для отправки сообщений. Существует несколько различных вариантов отправки сообщений между процессами. Некоторые из наиболее распространенных методов - это трубы и розетки . В зависимости от вашей ОС у вас могут быть доступны дополнительные опции; например, в QNX есть каналы, а в BeOS / Haiku - BMessages . Вы также можете найти библиотеку, которая аккуратно оборачивает эту функцию, например lcm .