C – Использование execvp с пользовательским вводом

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

Ниже приведен пример того, как у меня есть код сейчас; Я не везла с указателями. Ошибки также говорят, что мне нужно использовать const * char, но я видел в других примерах символ * char может быть введен пользователем.

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

Ошибка, которую я получаю, выглядит следующим образом:

 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' 

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

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

  1. *args[0] имеет смысла. args – массив. args[0] – char. что такое *args[0] ?

  2. Вы должны создать массив char* символом NULL с символом char* , который будет передан как второй аргумент.

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

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

 char *argv[]={args,NULL}; execvp(args,argv); 

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

 #include  #include  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() начнет иметь смысл. Обратите внимание, что если есть redirect ввода / вывода, то это ваша shell, которая должна будет это сделать (если вы не запустите реальную оболочку, чтобы сделать это для вас, как я).