Execvp и его аргументы - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Имею задачу, написать простенький интерпретатор shell'a, грубо говоря надо просто разобрать ввод и выполнить команду через execvp. Сразу её синтаксис из мана: int execvp(char * name, char *argv[]); с первым аргументом нету проблем, а вот со вторым.. Требуется тип char* const*, нужно, исходя из задачи, получить его динамически (со стандартного ввода), за лето потерял навык и смог разобрать ввод только через ограниченный массив char[256], затем попытался явно привести его к char* const* и передать в execvp, аллилуя, скомпилилось, но процесс не запускается Вот код:
#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]);
                }
И как бы намекают, что массив fl заполнен правильно, первый элемент - имя файла, далее аргументы\ключи. Все работает, только процесс не запускается (именно динамически не запускается, то есть, когда я пытаюсь получить его имя и аргументы со стандартного ввода). Можно сделать примерно так:
char* args[] = { "ls", "-l" };
execvp(args[0], args);
И все будет работать, но это, как Вы уже поняли, не подходит. Вообще проблема изначально не в execvp, я просто не понимаю в чем разница.. В любом случае при передаче массива я передаю указатель на первый элемент, так какая разница char[256] ли это или char* const*.. В общем заранее спасибо, надеюсь поможете.

Решение задачи: «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 выполняется следующее:

  1. Объявляется переменная i типа int, которая будет использоваться в цикле.
  2. Задаётся условие цикла for, который будет выполняться от 0 до argc (количество переданных аргументов).
  3. Внутри цикла выводится на экран номер текущего аргумента и сам аргумент с помощью функции printf.
  4. С помощью оператора return функция main завершает свою работу и возвращает 0, что означает успешный конец работы программы. Пример оформления списка с номерами и названиями переменных:
  5. Номер: i
  6. Значение: 0
  7. Номер: i
  8. Значение: argc
  9. Номер: i
  10. Значение: *argv++
  11. Номер: i
  12. Значение: 1
  13. Номер: i
  14. Значение: *argv++
  15. Номер: i
  16. Значение: 2
  17. Номер: i
  18. Значение: *argv++
  19. Номер: i
  20. Значение: 3
  21. Номер: i
  22. Значение: *argv++
  23. Номер: i
  24. Значение: 4 Обратите внимание, что выводимые значения переменных могут отличаться в зависимости от передаваемых аргументов при запуске программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.833 из 5
Похожие ответы