запуск импорта MySQL из execv - PullRequest
       6

запуск импорта MySQL из execv

0 голосов
/ 11 февраля 2012
pid_t childPid = fork ();
if (childPid == (pid_t) 0)//zero success
{
    const char *path = "/usr/local/mysql/bin/mysql";
    //doesn't work
    //char * const parmList[] = {"--user=root", "test_db", NULL};
    //does work
    char * const parmList[] = {"", "--user=root", "test_db", NULL};
    execv(path, parmList);
    printf("ERROR:\tFork failed.\n");   
}
else if (childPid < (pid_t) 0)// -1 failure
{
    /* The fork failed. */
    printf("ERROR:\tFork failed.\n");   
    return EXIT_FAILURE;
}
else
{
    while (true) {
        //stay alive
        sleep(1);
    }
}
printf("done");
exit(0);

У меня проблемы с импортом дампа sql с помощью execv.Вы можете видеть, что я не смог войти, используя первый paramList, но второй работал просто отлично.В любом случае, если я добавлю в список параметров:

char * const parmList[] = {"", "--user=root", "test_db", "<", "/Users/joelsaltzman/Desktop/dump.sql", NULL};

В выходных данных отображается справка mysql для аргументов командной строки, как будто я что-то неправильно напечаталКто-нибудь знает, как заставить это работать?

Ответы [ 3 ]

3 голосов
/ 12 февраля 2012

Первый paramList неверен, потому что первый элемент должен быть именем файла программы, которую вы собираетесь выполнить:

Аргумент argv - это массив символьных указателей с нулевым символом в концестроки.Приложение должно убедиться, что последний член этого массива является нулевым указателем.Эти строки должны составлять список аргументов, доступных для нового образа процесса.Значение в argv [0] должно указывать на имя файла, которое связано с процессом, запускаемым одной из функций exec.

Перенаправление ввода с < не работает, потому что это неособенность ядра (которое вы вызываете, используя execv), но из обычных оболочек Unix.Вызов библиотеки system - это то, что вы ищете.(Он также просто использует вызов из семейства exec, но вызывает команду с вашей командой, которая затем будет поддерживать <.)

Обязательно прочитайте man-страницу system(3) и подумайте опроверка ввода, если вы собираетесь передать ей строку, на которую может повлиять злоумышленник.

2 голосов
/ 12 февраля 2012

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

Нельзя использовать перенаправление с execv, поскольку это функция оболочки, а execv не запускает оболочку.Вы можете выполнить /bin/sh с параметрами, указывающими на выполнение mysql, или вы можете использовать dup2, чтобы изменить стандартный ввод на что хотите.

1 голос
/ 12 февраля 2012

Вместо этого используйте popen(), чтобы запустить mysql, а затем самостоятельно записать содержимое файла sql в процесс.

...