Самомодифицирующийся код в c

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

Пример:

void eng_run()
{

    int itr = 0;
    int itr2 = 0;
    int check = 0;
    int conf = 0;
    char arg1[10];
    char arg2[10];
    while(act_arg[itr] != NULL)
    {
        if((strcmp(act_arg[itr],"what") == 0) || (strcmp(act_arg[itr],"how") == 0) || (strcmp(act_arg[itr],"whats") == 0))
        {
            for(itr2 = itr + 1; act_arg[itr2] != NULL ; itr2++)
            {
                if((strcmp(act_arg[itr2],"list") == 0) || (strcmp(act_arg[itr2],"ls") == 0))
                {
                    printf("\E[32mThe \"ls\" system call lists out all the files in the current directory. \n\E[0m");
                    conf++;
                }
}
}
        else if((strcmp(act_arg[itr],"list") == 0) && conf == 0)
        {
            bzero(act_arg,100);
            act_arg[0] = (char *)malloc(sizeof(char) * 100);
            strcat(act_arg[0],"ls");
            check++;
        }
}
}

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

Что делает список? (или) список всех файлов

Теперь я хочу, чтобы он модифицировал себя во время выполнения, если этого хочет использование, добавив что-то вроде способа обработки команды cp. Это означает, что он принимает:

Что делает КП? (или) скопировать файл один в файл два

Использование копии в качестве ключевого слова.


person user2626335    schedule 05.10.2013    source источник
comment
Нет, нет никакого практического способа сделать это. Если вы хотите, чтобы программа изменила свои параметры по умолчанию, они должны быть сохранены в файле конфигурации, который она может обновлять при изменении. Если он должен учиться, он, вероятно, должен реализовать какой-то интерпретатор и сохранить новое знание в файле сценария, который он обрабатывает.   -  person Barmar    schedule 05.10.2013
comment
Вы также можете хранить такие вещи в базе данных.   -  person Barmar    schedule 05.10.2013
comment
Для этого вам не нужен самомодифицирующийся код. Ваш вопрос касается того, как изменить код на данные, т.е. список понятных команд не должен быть жестко закодирован, а должен считываться из структуры данных, которую можно изменить во время выполнения.   -  person Frerich Raabe    schedule 10.10.2013


Ответы (1)


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

person luser droog    schedule 05.10.2013