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

Поиск:

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


Эксперт
****


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

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



Здравствуйте.
Есть рабочий код простого шелла
Код

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

#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;
}
//---------------------------------------------------------------------------




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



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 i = 0;
    int e = 0;
    int ids[20];
    int pipes[20][2];
    for (int i = 0; i < block; i++)
        pipe(pipes[i]);

    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);}
                if (ids[i*e] != 0)
                {
                    if (cmdparams[i-1][e][0] != NULL)
                    {
                        dup2(pipes[i-1][0], 0);
                        close(pipes[i-1][0]);
                        close(pipes[i-1][1]);
                    }
                    if (cmdparams[i+1][e][0] != NULL)
                    {
                        close(pipes[i][0]);
                        dup2(pipes[i][1], 1);
                        close(pipes[i][1]);
                    }

                    //printf("%s\n", cmdparams[i][e][0]);
                    execvp(cmdparams[i][e][0], cmdparams[i][e]);
                    perror("error executing child process");
                    exit(1);
                }
                else
                {
                    if (cmdparams[i-1][e][0] != NULL)
                    {
                        close(pipes[i-1][0]);
                        close(pipes[i-1][1]);
                    }
                    if (cmdparams[i+1][e][0] != NULL)
                    {
                         pipes[i-1][0] = pipes[i][0];
                         pipes[i-1][1] = pipes[i][0];
                    }

                    dup2(pipes[i*e][1], 0);
                }
            }
            e++;
        }
        i++;
        e = 0;
    }

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

Он рабочий, только почем-то не всегда выводит то что нужно.
Тоесть иногда (если попробовать запустить его несколько раз) он невыводит результата вообще.
Вопрос - в чём-же тут может быть дело? 



P.S.
Извините что флудю с этими пайпами  smile 

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

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

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


 




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


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

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