Приведение аргументов командной строки? - PullRequest
0 голосов
/ 13 октября 2010

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

#ConfigFile.cfg
name=geoffrey
city=montreal

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

> myProgram.exe configFile.cfg

возможно ли преобразовать эти записи файла конфигурации в файл конфигурации, что позволяет мне обойти необходимость записи файла конфигурации на диск, но при этом позволить программе работать так, как будто она читает файл конфигурации?

возможно что-то вроде следующего:

> myProgram.exe configFile.cfg(name=geoffrey) configFile.cfg(city=montreal)

1 Ответ

1 голос
/ 13 октября 2010

Если вы не контролируете источник для программы, которую вы упаковываете, и она еще не предоставляет средства для получения ввода другим способом, вам в лучшем случае будет трудно.

Одна из возможностей - перехватить файл и открыть вызовы, используемые программой, хотя это ужасный способ сделать это.

Это, вероятно, потребует внедрения ваших собственных библиотек времени выполнения, содержащих (для C) fopen, fclose, fread и так далее, между программой и реальными библиотеками (такими как LD_LIBRARY_PATH или что-то подобное) и это при условии, что оно не связано статически. Не то, что для слабонервных.

Если вы беспокоитесь о том, что люди могут видеть ваш файл, есть множество способов избежать этого, например, создав его с разрешениями rwx------ в аналогично защищенном каталоге (при условии UNIX-подобной ОС). Это, вероятно, безопаснее, чем использовать аргументы командной строки, которые любой вошедший в систему джокер может узнать с помощью команды ps.

Если вы просто не хотите создавать файл, я думаю, вам не придется его избегать, это будет намного больше.

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

Это все равно будет записываться на диск, но это больше не будет ответственностью вашей программы-оболочки. Что-то вроде (немного грубовато, но вы должны понять):

#include <stdio.h>
#define PROG "myProgram"
int main (int argCount, char *argVal[]) {
    char *tmpFSpec;
    FILE *fHndl;
    int i;
    char *cmdBuff;

    tmpFSpec = getTempFSpec(); // need to provide this.

    cmdBuff = malloc (sizeof(PROG) + 1 + strlen (tmpFSpec) + 1);
    if (cmdBuff == NULL) {
        // handle error.
        return 1;
    }

    fHndl = fopen (tmpFSpec, "w");
    if (fHndl == NULL) {
        // handle error.
        free (cmdBuff);
        return 1;
    }

    for (i = 1; i < argCount; i++)
        fprintf (fHndl, "%s\n", argVal[i]);

    sprintf (cmdBuff, "%s %s", PROG, tmpFSpec);
    system (cmdBuff);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...