kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 andrewrk
andrewrk
Вопрос

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

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

Какой самый чистый способ реализовать это?

9 2008-08-13T22:40:57+00:00 6
 sth
sth
Редактировал вопрос 11-го августа 2010 в 4:58
Программирование
command-line
c
architecture
io
Derek Park
Derek Park
13-го августа 2008 в 10:49
2008-08-13T22:49:13+00:00
Дополнительно
Источник
Редактировать
#8414375

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

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

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

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

Derek Park
Derek Park
Редактировал ответ 13-го августа 2008 в 10:53
8
0
 Stu
Stu
13-го августа 2008 в 10:51
2008-08-13T22:51:30+00:00
Дополнительно
Источник
Редактировать
#8414376

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

5
0
Ted Percival
Ted Percival
18-го августа 2008 в 8:55
2008-08-18T08:55:41+00:00
Дополнительно
Источник
Редактировать
#8414378

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

Взгляните на Beej'руководство к Unix МПК, особенно в главе о сокетов Unix.

4
0
 pbernatchez
pbernatchez
7-го июня 2010 в 2:47
2010-06-07T14:47:50+00:00
Дополнительно
Источник
Редактировать
#8414379

Что никто не сказал Вот это: "Вы можете'т получить там от Здесь".

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

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

Других ответов предложить пути достижения связи.

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

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

 pbernatchez
pbernatchez
Редактировал ответ 7-го июня 2010 в 2:55
1
0
 bta
bta
11-го августа 2010 в 5:32
2010-08-11T17:32:45+00:00
Дополнительно
Источник
Редактировать
#8414380

Один метод я видел у ведущего только на "Шелл" и для реальной программы. Например, когда вы нормально запустите приложение (например: ./Хоста), программа вилки в графе "приложение" и часть кода. Когда вы запустите вашу программу таким образом, что позволяет предположить, что вы хотите, чтобы сигнал на запуск (напр.:. /Хост-отправить сообщение "рестарт"), программа вилки в графе "отправитель" и часть кода. Это's, как имея два приложения в одном. Другой вариант, который не'т использоватьвилкасделатьхозяиначисто "и отправителя сообщения и" приложение, и вашу "приложение" и как отдельный исполняемый файл (напр:Host_core`), что "хозяин" может запускать отдельно.

В "приложение" по части вашей программы, которые понадобятся для открытия какой-то канал связи для получения сообщений, и "отправителя сообщения и" часть придется подключать на этот канал и использовать его для отправки сообщений. Есть несколько различных вариантов, доступных для отправки сообщений между процессами. Некоторые из наиболее распространенных методов труб и розетки. В зависимости от вашей операционной системы, вы можете иметь дополнительные опции, например, ОС QNX имеет каналы и Беос/Хайку есть BMessages. Вы также можете быть в состоянии найти библиотеку, которая аккуратно оборачивает эту функцию, например НОК.

0
0
Ed S.
Ed S.
13-го августа 2008 в 10:43
2008-08-13T22:43:34+00:00
Дополнительно
Источник
Редактировать
#8414374

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

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

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

EDIT: Ок, он хотел что-то другое, но это было не совсем ясно до того, как вопрос был отредактирован. Не надо набрасываться на мою репу...

Ed S.
Ed S.
Редактировал ответ 13-го августа 2008 в 10:52
-2
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 6 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией