Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пайпы 2 
V
    Опции темы
Ak47black
  Дата 30.9.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Здравствуйте.
Может кто-нибудь хоть как-то подтолкнёт меня.
Сегодня весь день потратил, но так и не понял

Мне нужно написать shell под unix, 
который например получает команду 
Цитата

ls -l | cut -c 1-20 | cut -c 1-1

и её выполняет
Вот такой код имею
Код

//---------------------------------------------------------------------------

#pragma hdrstop

#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <netinet/in.h>
#include <resolv.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

void parseA(char* input);
void parseB(char* input);
void parseC(char* input);
void parseD(char* input);







char* cmdparams[20][20][20] = {NULL};
int block = 0;
int cmd = 0;
int param = 0;

void parseA(char* input)
{
    while (input[0] != 0)
    {
        cmd = 0;
        const char* delim = strchr(input, '|');
        if (delim)
        {
            int len = delim-input;
            char* subcmd = (char*)malloc(len);
            strncpy(subcmd, input, len);
            subcmd[len] = '\0';

            parseB(subcmd);
            block++;
            strcpy(input, delim+1);
        }
        else
        {
            parseB(input);
            return;
        }
    }
}

void parseB(char* input)
{
    while (input[0] != 0)
    {
        param = 0;
        char* delim = strchr(input, '&');
        if (delim)
        {
            int len = delim-input;
            char* subcmd = (char*)malloc(len);
            strncpy(subcmd, input, len);
            subcmd[len] = '\0';
            parseC(subcmd);
            cmd++;
            strcpy(input, delim+1);
        }
        else
        {
            parseC(input);
            return;
        }
    }
}

void parseC(char* input)
{
   while (input[0] == ' ') strcpy(input, input+1);
   while (input[strlen(input)-1] == ' ') input[strlen(input)-1] = '\0';

   while (input[0] != 0)
   {
        char* delim = strchr(input, ' ');
        if (delim)
        {
            int len = delim-input;
            char* subcmd = (char*)malloc(len);
            strncpy(subcmd, input, len);
            subcmd[len] = '\0';
            parseD(subcmd);
            param++;
            strcpy(input, delim+1);
        }
        else
        {
            parseD(input);
            return;
        }
   }
   
}

void parseD(char* input)
{
    cmdparams[block][cmd][param] = input;
}
//---------------------------------------------------------------------------

void childproc(char* params[], int pipes[2])
{
    // Wait for event?


    printf("%s %d %d\n", params[0], pipes[0], pipes[1]);
    if (pipes[0] != 0)
    {
        //printf("HERE1!!!!\n");
        dup2(pipes[0], 0);
        close(pipes[0]);
    }
    if (pipes[1] != 0)
    {
        //printf("HERE2!!!!\n");
        dup2(pipes[1], 1);
        close(pipes[1]);
    }


    execvp(params[0], params);

    perror("error executing child process");
    exit(1);
}



//---------------------------------------------------------------------------



int main(int argc, char* argv[])
{
    char input[] = "ls -l | cut -c 1-20 | cut -c 1-1 \0";
    parseA(input);
    if (input[0] == 0) {perror("no params"); exit(1);} 

    
    int pipes[20][2];
    for (int i = 0; i < block; i++)
    {
        if (pipe(pipes[i]) == -1)    {perror("error creating pipe"); exit(1);}
    }
    //printf("%d", block);
    //printf("%d\n", pipes[0][0]);
    //printf("%d\n", pipes[0][1]);
    //printf("%d\n", pipes[1][0]);
    //printf("%d\n", pipes[1][1]);

    //printf("%s, %s\n", pipes[1][0], pipes[1][1]);



    int i = 0;
    int e = 0;
    int ids[20];
    while (cmdparams[i][e][0] != NULL)
    {



        while (cmdparams[i][e][0] != NULL)
        {
            if (cmdparams[i][e][0] != NULL)
            {
                if ((ids[i*e] = fork()) == -1)   {perror("error creating child process"); exit(1);}
                int pipe[2];
                if (i == 0) pipe[0] = 0;
                    else pipe[0] = pipes[i-1][1];
                if (cmdparams[i+1][e][0] == NULL) pipe[1] = 0;
                 else pipe[1] = pipes[i][0];

                if (ids[i*e] != 0) childproc(cmdparams[i][e], pipe);
                
            }            

            e++;
        }
        i++;
        e = 0;
    }

    printf("from parent\n");
    getchar();
    return 0;
}
//---------------------------------------------------------------------------

Пробую выполнить 
но получаю
Цитата

ls 0 3
from parent
cut 4 5
cut: -: Bad file descriptor
cut 6 0
cut: -: Bad file descriptor
ls: write error: Bad file descriptor

проблема с пайпами, но так и немогу понять где  smile  smile  smile 
PM MAIL   Вверх
JustHuman
Дата 1.10.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.9.2010

Репутация: нет
Всего: нет



Вам следует переписать прогу полностью, так как она трудно читаема. (по крайней мере мне так кажется).
К сожалению сказать в чем пробема я не могу, ибо разобратся тоже не могу в коде. Есть пару замечаний:
1. Это неправильно генерировать сразу 20 штук пайпов. Они все унаследуются потомками и вроде вы их нигде не закрываете.
2. Сделайте нормальный лексический и синтаксический анализатор. Поверьте писать дальше будет значительно проще.
Ну а если влом переписывать, то возьмите бумагу и ручку smile

Это сообщение отредактировал(а) JustHuman - 1.10.2010, 15:20
PM MAIL   Вверх
Ak47black
Дата 1.10.2010, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата(JustHuman @  1.10.2010,  15:18 Найти цитируемый пост)
1. Это неправильно генерировать сразу 20 штук пайпов. Они все унаследуются потомками и вроде вы их нигде не закрываете.

А собственно сколько мне их нужно? smile

Это сообщение отредактировал(а) Ak47black - 1.10.2010, 15:38
PM MAIL   Вверх
Ak47black
Дата 1.10.2010, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Цитата(JustHuman @  1.10.2010,  15:18 Найти цитируемый пост)
2. Сделайте нормальный лексический и синтаксический анализатор. Поверьте писать дальше будет значительно проще.

У меня уже и так всё нормально работает.
Там просто функции делают страшный вид
Код

void parseA(char* input);
void parseB(char* input);
void parseC(char* input);
void parseD(char* input);


Добавлено через 2 минуты и 12 секунд
Поймите меня правильно - я совсем застрял, а двигаться нужно.
Хотя-бы кто-нибудь посоветуйте пожалуйста что можно прочитать.
Что-бы там только было написано о том как запустить больше 2 приложений связанных трубами или детально о самой сути этого дела.
PM MAIL   Вверх
Ak47black
Дата 1.10.2010, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2205
Регистрация: 2.12.2005

Репутация: нет
Всего: 0



Вообщем добил только что,
 после нескольких дней мучения.  smile 

Это сообщение отредактировал(а) Ak47black - 1.10.2010, 17:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.