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 Обратите внимание, что выводимые значения переменных могут отличаться в зависимости от передаваемых аргументов при запуске программы.