Execvp и его аргументы - C (СИ)
Формулировка задачи:
Здравствуйте.
Имею задачу, написать простенький интерпретатор shell'a, грубо говоря надо просто разобрать ввод и выполнить команду через execvp.
Сразу её синтаксис из мана:
int execvp(char * name, char *argv[]);
с первым аргументом нету проблем, а вот со вторым.. Требуется тип char* const*, нужно, исходя из задачи, получить его динамически (со стандартного ввода), за лето потерял навык и смог разобрать ввод только через ограниченный массив char[256], затем попытался явно привести его к char* const* и передать в execvp, аллилуя, скомпилилось, но процесс не запускается
Вот код:
Можете впринципе запускать у себя, вот эти строчки работают:
И как бы намекают, что массив fl заполнен правильно, первый элемент - имя файла, далее аргументы\ключи.
Все работает, только процесс не запускается (именно динамически не запускается, то есть, когда я пытаюсь получить его имя и аргументы со стандартного ввода).
Можно сделать примерно так:
И все будет работать, но это, как Вы уже поняли, не подходит.
Вообще проблема изначально не в execvp, я просто не понимаю в чем разница.. В любом случае при передаче массива я передаю указатель на первый элемент, так какая разница char[256] ли это или char* const*..
В общем заранее спасибо, надеюсь поможете.
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #define spc (c != ' ' && c != '\t') #define nspc (c == ' ' || c == '\t') typedef enum {CMD, SPC, FLAG, SPF} state; int main() { int c, flc = 0, flsc = 0; char fl[256][256]; state flag = CMD; while ((c = getchar()) != EOF) { if (c == '\n') { if (fork() != 0) { //parent wait(0); } else { //child printf("Executing ps: %s\n", fl[0]); for (int i = 0; i <= flc; i++) { printf("FL%d: %s\n", i, fl[i]); } execvp(fl[0], (char* const*)fl); } //clean: for (int j = 0; j <= flc; j++) { for (int k = 0; k < 256; k++) { fl[j][k] = '\0'; } } flc = 0; flsc = 0; } else if (flag == CMD && spc) { fl[0][flsc++] = c; } else if (flag == CMD && nspc) { flag = SPC; } else if ((flag == SPC || flag == SPF) && spc) { flc++; flsc = 0; flag = FLAG; fl[flc][flsc++] = c; } else if (flag == FLAG && spc) { fl[flc][flsc++] = c; } else if (flag == FLAG && nspc) { flag = SPF; } } return 0; }
for (int i = 0; i <= flc; i++) { printf("FL%d: %s\n", i, fl[i]); }
char* args[] = { "ls", "-l" }; execvp(args[0], args);
Решение задачи: «Execvp и его аргументы»
textual
Листинг программы
#include <stdio.h> int main(int argc, char *argv[]) { int i; for (i = 0; i <= argc; i++) printf("%d: %s\n", i, *argv++); return 0; }
Объяснение кода листинга программы
В данном коде на языке C выполняется следующее:
- Объявляется переменная
i
типа int, которая будет использоваться в цикле. - Задаётся условие цикла
for
, который будет выполняться от 0 доargc
(количество переданных аргументов). - Внутри цикла выводится на экран номер текущего аргумента и сам аргумент с помощью функции
printf
. - С помощью оператора
return
функцияmain
завершает свою работу и возвращает 0, что означает успешный конец работы программы. Пример оформления списка с номерами и названиями переменных: - Номер: i
- Значение: 0
- Номер: i
- Значение: argc
- Номер: i
- Значение: *argv++
- Номер: i
- Значение: 1
- Номер: i
- Значение: *argv++
- Номер: i
- Значение: 2
- Номер: i
- Значение: *argv++
- Номер: i
- Значение: 3
- Номер: i
- Значение: *argv++
- Номер: i
- Значение: 4 Обратите внимание, что выводимые значения переменных могут отличаться в зависимости от передаваемых аргументов при запуске программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д