Re[3]: Нарезка командной строки
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.08.05 14:02
Оценка:
Здравствуйте, aeropunk, Вы писали:

A>Спасибо! Да, использование default shell — это лучший из имеющихся у меня вариантов.

A>Но еще красивее было бы решить задачу без его использования.
A>М.б. все-таки есть библиотека?

Да, есть

1. Исходники любого unix-ового shell-a (bash, zsh, ...)
2. Библиотека ACE и класс ACE_ARGV (Re[5]: Нарезка командной строки
Автор: eao197
Дата: 23.08.05
).

Нужный тебе код оттуда выдирается и вставляется в твой проект (если лицензия позволяет).
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[4]: Нарезка командной строки
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 23.08.05 14:13
Оценка:
Здравствуйте, eao197, Вы писали:

A>>Но еще красивее было бы решить задачу без его использования.


А почему красивее? Ведь это же типичный Unix-way: если есть готовый инструмент, который решает конкретную задачу, то нужно использовать этот инструмент для решения данной задачи. shell -- как раз такой инструмент.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[3]: Нарезка командной строки
От: dottedmag Мальта http://dottedmag.net/
Дата: 23.08.05 14:22
Оценка: 2 (2)
Здравствуйте, aeropunk, Вы писали:

A>Спасибо! Да, использование default shell — это лучший из имеющихся у меня вариантов.

A>Но еще красивее было бы решить задачу без его использования.

Требования к разбиению строки на аргументы описаны в соответствующем разделе POSIX, и поэтому вполне можно полагаться на default shell.

A>М.б. все-таки есть библиотека?


В Unix для многих вещей библиотеки отсуствуют. За ненадобностью.
Re[5]: Нарезка командной строки
От: aeropunk  
Дата: 23.08.05 14:26
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, MaximE, Вы писали:


>>> <...код поскипан...>

>>>
>>> Как чисто Unix-овое решение -- самый лучший вариант. Только под Windows без fork-а такого не сделаешь. Разве что под cygwin-ом работать.

ME>>У них там есть spawn — похоже на fork() + exec(). http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/_crt_process_and_environment_control.asp


E>Что-то я запутался в трех соснах. В исходном сообщении:

E>

E>Задачка состоит в том, чтобы нарезать командную строку, полученную из конфигурационного файла на отдельные аргументы для последующей передачи этих агрументов в один из 6 вызовов семейства exec. Как это сделать? Хочется воспользоваться чем-нибудь уже готовым и лучше всего системным, чтобы не пришлось отлавливать потом баги в очередной сторонней библиотеке.


E>Т.е., раз exec, значит нужно запустить новый процесс вместо старого. Тогда вообще ничего мудрить не нужно -- через exec зовем shell и скармливаем ему всю строку параметров, без fork-а.


E>Или же не вся задача была озвучена.


Скажем так, задача имеет два направления: практическое и общепознавательное.
Естественным образом практическое направление имеет для меня более высокий приоритет.
Поэтому если не будет найдено другое решение, я реализую fork — execv c вызовом default shell, которому будет передано 2 параметра: -с и ищеющиеся из конфигурационного файла параметры. Т.е. собственно "назерка" будет изящно обойдена. Для решения практической части задачи это будет вполне достаточно.

С общепознавательной т.з. может потребоваться в самой программе иметь нарезку командной строки (не своей, а какой угодно). Здесь опять может сработать фокус с default shell. Для этого достаточно написать простенькую программку, которая будет (в общем случае не важно каким образом) отсылать родителю свои собственные аргументы, полученные из main. Но породжение нового процесса для этой цели с моей т.з. выглядит несколько тяжеловесно.

P.S. Прошу прощения, fork конечно же подразумевался.
Re[5]: Нарезка командной строки
От: aka50 Россия  
Дата: 23.08.05 14:50
Оценка:
Здравствуйте, aeropunk, Вы писали:

A>Здравствуйте, aka50, Вы писали:


A>>Такой думаю нет.


A>Есть масса различных командных оболочек, многие из них существуют уже очень давно, все они как-то решают вставшую передо мной задачу. Синтаксис многих командных оболочек весьма похож, если не идентичен.

Каждая оболочка имеет свое решение этой проблемы. Например zsh:
/* parse string into a list */

/**/
mod_export Eprog
parse_string(char *s)
{
    Eprog p;
    int oldlineno = lineno;

    lexsave();
    inpush(s, INP_LINENO, NULL);
    strinbeg(0);
    lineno = 1;
    p = parse_list();
    lineno = oldlineno;
    if (tok == LEXERR && !lastval)
        lastval = 1;
    strinend();
    inpop();
    lexrestore();
    return p;
}


/**/
mod_export Eprog
parse_list(void)
{
    int c = 0;
    
    tok = ENDINPUT;
    incmdpos = 1;
    yylex();
    init_parse();
    par_list(&c);
    if (tok != ENDINPUT) {
        clear_hdocs();
        tok = LEXERR;
        yyerror(0);
        return NULL;
    }
    return bld_eprog();
}


ну и т.д. Ведь она не только разбивает по параметрам, но и выполняет еще кучу всяких вещей типа выполнения операторов while, for, раскрытие
"*.txt" и переменных окружения...

A>Это размышление и натолкнуло меня на мысль, что должна существовать какая-то стандартная для POSIX библиотека, решающая эту задачу.

Не. Каждый шел решает ее по своему к сожалению.
Re[6]: Нарезка командной строки
От: 4ertus2  
Дата: 18.09.05 18:37
Оценка:
Здравствуйте, aeropunk, Вы писали:

A>Здравствуйте, eao197, Вы писали:


A>Поэтому если не будет найдено другое решение, я реализую fork — execv c вызовом default shell, которому будет передано 2 параметра: -с и ищеющиеся из конфигурационного файла параметры. Т.е. собственно "назерка" будет изящно обойдена. Для решения практической части задачи это будет вполне достаточно.


Тем более, что это уже реализовано:

#include <stdlib.h>
system(const char* command);


А насчет нарезки — стоило бы посмотреть как эта самая нарезка реализована в исходниках вашего default shell-a
Непривязанное к форме вечно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.