Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

не получается воспользоваться execvp

74K
15 сентября 2011 года
marsh
1 / / 15.09.2011
[COLOR="red"]//add походу тему создал не там, перенесите сюда: http://forum.codenet.ru/forums/30, если не трудно.[/COLOR]

Здравствуйте.

Имею задачу, написать простенький интерпретатор shell'a, грубо говоря надо просто разобрать ввод и выполнить команду через execvp.

Сразу её синтаксис из мана:
 
Код:
int execvp(char * name, char *argv[]);

с первым аргументом нету проблем, а вот со вторым.. Требуется тип char* const*, нужно, исходя из задачи, получить его динамически (со стандартного ввода), за лето потерял навык и смог разобрать ввод только через ограниченный массив char[256], затем попытался явно привести его к char* const* и передать в execvp, аллилуя, скомпилилось, но процесс не запускается. :mad:

Вот код:
Код:
#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);
                }
                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;
}


Что я делаю не так? Как-то грустно, что я остановился, или даже застрял, на самой простой части реализации программы :facepalm:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог