Регистрация вызовов функции в файле и использование этого файла журнала в качестве программного кода - PullRequest
1 голос
/ 15 января 2010

У меня есть приложение, написанное на C, которое регистрирует мои вызовы функций, записывая их в файл. Теперь мне нужно повторно использовать эти зарегистрированные вызовы функций в другом C-приложении (что также является причиной регистрации).

Это приложение должно делать - наряду с другими вещами - именно то, что было зарегистрировано.

Пример: МИЛОГФИЛЬ, который был написан первым заявлением

printf("Starting main process w/ pid %d\n", (int)getpid());
    Display *dsp = XOpenDisplay( NULL );

Затем второе приложение должно выполнить вызовы функций, зарегистрированные и извлеченные из файла.

Есть идеи, как это реализовать?

Ответы [ 2 ]

1 голос
/ 15 января 2010

По сути, вы хотите сгенерировать код на C и выполнить этот код, верно? Если это так, вы можете проверить TCC , который доступен в виде библиотеки и предоставляет именно эту функцию.

Конечно, если предположить, что ваша платформа входит в число поддерживаемых.

Тем не менее, я бы предпочел не испускать код C и иметь другое приложение, читающее его, компилирующее и выполняющее его. Я бы предложил вам одно из следующего:

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

  2. Вставьте язык сценариев (например, Lua ) во вторую программу и создайте файл журнала на этом языке.

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

В качестве самого последнего решения, если вы хотите испустить C, вы можете использовать system() для вызова вашего компилятора, а не скомпилированной программы. Но я бы очень сильно отговорил вас сделать это!

0 голосов
/ 15 января 2010

Похоже, вы создаете какой-то механизм репликации. Узел A выполняет действия с 1 по N, а затем вы хотите повторить те же действия на узле B.

Здесь много вариантов, но все они делятся на две категории:

Вариант 1. Запишите файл журнала в формате, который может использоваться существующей утилитой. Если бы вы использовали JavaScript или другой язык с функцией eval, это было бы очень просто. Вы просто записали бы JavaScript в файл журнала на узле A, а затем «оценили» его с узла B.

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

int main(int argc, char *argv[]) {
    // Do your setup stuff here.
#include "/path/to/the/log/file"
    // Clean up.
    return 0
}

Вариант 2. Создайте синтаксический анализатор, который анализирует и выполняет журнал в контексте какой-либо другой программы.

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

...