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