C execlp () неправильно обрабатывает строку параметров - PullRequest
1 голос
/ 20 января 2011

Я создаю оболочку для класса операционных систем, который должен использовать exec () или один из его вариантов для выполнения внешних команд.В настоящее время я использую execlp(command,command_parameters, (char *) NULL).При этом команда запускается очень хорошо (например, ls возвращает стандартный список каталогов), но, похоже, не выполняет синтаксический анализ каких-либо параметров (например, выполнение mkdir hello выдает ошибку "hello: отсутствующий операнд ... Попробуйте" hello --help 'для получения дополнительной информации.) Чего мне не хватает?

            else // Try to handle an external command
        {
            char *command_parameters = malloc(sizeof(raw_command)-sizeof(command));
            strcpy(command_parameters, raw_command+strlen(command)+1);
            pmesg(1, "Command is %s.\n", command);
            pmesg(1, "The command parameters are %s.\n", command_parameters);
            pid_t pid = fork();
            pmesg(1, "Process forked. ID = %i. \n", pid);
            int status;
            if (fork < 0)
            {
                printf("Could not fork a process to complete the external command.\n");
                exit(EXIT_FAILURE);
            }
            if (pid == 0) // This is the child process
            {
                pmesg(1, "This is the child process, running execlp.\n");
                if (execlp(command, command_parameters, (char *) NULL) < 0)
                {
                    printf("Could not execute the external command.\n");
                    exit(EXIT_FAILURE);
                }
                else    { pmesg(1, "Executed the child process.\n"); }
            }
            else {while(wait(&status) != pid); } // Wait for the child to finish executing
            pmesg(1, "The child has finished executing.\n");
        }

(pmesg - это тег отладки, который печатает оператор с определенным уровнем отладки).

Спасибо!

1 Ответ

3 голосов
/ 20 января 2011

Пара вопросов здесь:

  1. execlp( const char *file, const char *arg, ...) ожидает, что аргументы будут разделены и переданы отдельно, а не как одна большая строка.
  2. Первый аргумент (после const char *file) - это имя исполняемого файла, который вы запускаете, который помещается в argv[0] в вызываемой программе. Таким образом, первый параметр должен идти после этого.

например:.

execlp( command, command, arg1, arg2, ..., (char *)NULL );

С тем, что у вас есть, делая это так:

execlp( command, command, command_parameters, (char *)NULL );

, вероятно, позаботится о вашей проблеме с "mkdir", "hello", но вы все еще не разбиваете строку command_parameters, поэтому она не будет работать без изменений для команд с более чем одним аргументом.

РЕДАКТИРОВАТЬ : P.S. Ваша линия

if (fork < 0)

должно быть

if (pid < 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...