печать через командную строку данных запущенного процесса linux C - PullRequest
2 голосов
/ 05 декабря 2011

Сценарий следующий (код еще не доступен): процесс linux всегда выполняется в цикле while (1). Процесс реализован на C / C ++ (POSIX). Процесс сохраняет некоторые данные в std :: vector.

myvector.push_back("test1");
myvector.push_back("test1");
myvector.pop_back();
myvector.push_back("test1");

Процесс запускается и изменяет вектор. Я ищу механизм, который будет печатать векторные значения при выполнении двоичного файла с определенным аргументом командной строки.

Допустим, что процесс называется "myprocess" и работает. Я хочу выполнить тот же двоичный файл из новой оболочки, например ./myprocess -debug, и распечатать значения контейнера STL.

Есть идеи? Каков наилучший механизм для этого (например, печать памяти другого процесса)

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

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

Для этого вы можете использовать сигнал POSIX (например, SIGUSR1).

Более гибкий подход - процесс прослушивает именованный канал (или порт TCP) и принимает команды через него. Одной из таких команд может быть распечатка содержимого вектора.

1 голос
/ 05 декабря 2011

(Чтобы завершить последнее предложение @aix)

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

Например, вы можете сделать его HTTP-сервером (например, с Onion HTTP-сервером ), способным понимать запросы.Эти запросы могут даже содержать некоторый язык сценариев (например, lua ), тогда вы будете встраивать интерпретатор для их обработки (например, в отдельном потоке).В этом случае позаботьтесь о проблемах синхронизации (например, заблокировав мьютексом или заблокировав доступ к данным для чтения-записи).

Преимущество использования протокола HTTP заключается в том, что вы можете проверять свое приложение с помощью браузера.,(Но вам может понадобиться обрабатывать сеансы, аутентификации и т. Д.).

Вы также можете использовать свой собственный протокол или RPC-XDR, Corba и т. Д. И т. Д.

Вы также можете принимать одиночные запросы (например, в Lua), в каждой строке, до telnet.

И вы можете поместить данные, чтобы они были видны снаружи в сегменте совместно используемой памяти, используя posix shm

В общем, такое изменение спецификации требует некоторых архитектурных изменений программного обеспечения

Детали могут быть не простыми ...

...