C - Использование execvp с пользовательским вводом - PullRequest
0 голосов
/ 14 февраля 2012

В настоящее время я пытаюсь, чтобы моя программа на C читала аргументы Unix от пользователя.Я до сих пор искал этот сайт, но я не смог точно выяснить, что я делаю неправильно - хотя по общему признанию мои навыки реализации указателя довольно ограничены.сейчас;Я бездельничал с указателями без удачи.Ошибки также говорят, что мне нужно использовать const * char, но я видел в других примерах, что * char может быть введен пользователем.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

main()
{
    char args[128];
    //User input
    printf("> ");
    fgets(args, 128, stdin);
    execvp(args[0], *args[0]);
}

Я получаю следующую ошибку:1006 *

smallshellfile.c: In function ‘main’:
smallshellfile.c:13:21: error: invalid type argument of unary ‘*’ (have ‘int’)
smallshellfile.c:13:5: warning: passing argument 1 of ‘execvp’ makes pointer from integer without a cast [enabled by default]
/usr/include/unistd.h:575:12: note: expected ‘const char *’ but argument is of type ‘char’

Кто-нибудь знает, в чем может быть проблема?

Ответы [ 2 ]

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

У вас есть несколько проблем:

  1. *args[0] бессмысленно.args это массив.args[0] - символчто такое *args[0]?

  2. Вы должны создать массив с нулевым символом в конце char* для передачи в качестве второго аргумента.

  3. args[0] - первый символ в args.Вы должны передать всю строку (просто args), а не только ее первый символ.

Попробуйте что-то вроде:

char *argv[]={args,NULL};
execvp(args,argv);
0 голосов
/ 14 февраля 2012

Это может работать лучше для вас:

#include <stdio.h>
#include <unistd.h>

int main(void)
{
    char args[128];
    char *argv[] = { "sh", "-c", args, 0 };
    printf("> ");
    if (fgets(args, 128, stdin) != 0)
    {
        execvp(argv[0], argv);
        fprintf(stderr, "Failed to exec shell on %s", args);
        return 1;
    }
    return 0;
}

Имеет минимально необходимые заголовки;он имеет правильно объявленный main() - C99 требует явного возвращаемого типа;он запускает оболочку для информации, которую вводит пользователь. Сообщение об ошибке корректно завершается новой строкой, если пользователь не набрал более 126 символов, прежде чем нажать клавишу возврата.Если execvp() или какая-либо из функций exec*() вернется, произойдет сбой;вам не нужно проверять его статус.

Я феноменально изменяю, заставляя оболочку выполнять настоящую работу.Но вы можете захотеть разделить то, что пользователь набрал на слова, чтобы команда была первой и было несколько аргументов.Затем вы выделите больший массив argv и проанализируете строку, поместив каждый отдельный аргумент в свою собственную запись в argv, а затем использование execvp() начинает иметь смысл.Обратите внимание, что если необходимо выполнить перенаправление ввода / вывода, то это будет делать ваша оболочка (если вы не запустите реальную оболочку, чтобы сделать это для вас - как я).

...