main () используется как функция и CLI

У меня есть несколько исходных файлов, которые работают вместе как анонимные узлы публикации / подписки. Есть основная функция, которая собирает все узлы и запускает их через их стартовые функции.

// main.cpp
#include "nodeA.h"
#include "nodeB.h"

int main(int argc, char *argv[])
{
  /* some argument parsing here */
  start_node_a(argc, argv);
  start_node_b(argc, argv);
}

Чтобы упростить настройку, я хотел бы превратить основную функцию в сценарий оболочки, который запускает эти узлы. Это означало бы превращение start_node() функций в main() функции, чтобы они запускались из командной строки.

#!bin/bash
node_a -args
node_b -different_args

Это усложняет выполнение тестов, т.

Мое решение состоит в том, чтобы обернуть start_node функции в главную функцию, но для этого требуется дополнительный шаблон для каждого узла и некоторые дополнительные мастерские сборки, чтобы игнорировать main во время тестового связывания, но не сборки узла (на самом деле я не уверен, смогу ли я получить это пока работать с gnumake & g ++).

// nodeA.cpp  
int main(int argc, char *argv[])
{
  start_node_a(argc, argv);
}

Есть ли более элегантный способ сделать это? Метод запуска программы из вызова функции в тестах и ​​запуска программы из командной строки?

* Примечание: я также думал о системных вызовах, но считаю, что это худшее решение, чем использование оболочки main ().


person stebl    schedule 02.03.2015    source источник
comment
Кстати, system (3) не не < / i> системный вызов (перечислен в syscalls (2) ....). Он использует fork, execve, /bin/sh ....   -  person Basile Starynkevitch    schedule 02.03.2015
comment
Интересно, я этого не знал. После прочтения: здесь и здесь. Это может быть приемлемо для нас   -  person stebl    schedule 02.03.2015


Ответы (1)


Рассматривали ли вы возможность встраивания интерпретатора (например, Lua или Хитрость) внутри вашей программы? Затем вы могли бы написать какой-нибудь скрипт (на Lua, Guile и т. Д.), Чтобы управлять своими различными start_node_a и т. Д.

По сути, вы добавите некоторые прикладные примитивы, привязанные и приклеенные к интерпретаторам Lua или Guile, и напишите несколько сценариев Lua или Guile. Оба документа хорошо документированы (вот Lua doc, вот Guile doc) и очень часто используется.

Для Lua: создайте состояние, используя lua_newstate, затем используйте lua_register, чтобы добавить примитив, luaL_dofile, чтобы запустить файл, luaL_dostring, чтобы оценить строку.

Для Хитрости: прочтите Обзор программирования

Кстати, я бы порекомендовал Guile (с лицензией LGPL) по сравнению с Lua (с лицензией MIT), потому что мне больше нравится Scheme (язык Guile), чем язык Lua. Во всех случаях будьте осторожны с управлением памятью.

person Basile Starynkevitch    schedule 02.03.2015
comment
Я слышал о Lua, но не знаком с ним, не могли бы вы рассказать, как это будет работать? - person stebl; 02.03.2015
comment
Думаю, это хорошее решение. Я также просмотрел этот пример, который мне очень помог в начале работы. Спасибо! - person stebl; 03.03.2015