Здравствуйте, aeropunk, Вы писали:
A>Спасибо! Да, использование default shell — это лучший из имеющихся у меня вариантов. A>Но еще красивее было бы решить задачу без его использования. A>М.б. все-таки есть библиотека?
Здравствуйте, eao197, Вы писали:
A>>Но еще красивее было бы решить задачу без его использования.
А почему красивее? Ведь это же типичный Unix-way: если есть готовый инструмент, который решает конкретную задачу, то нужно использовать этот инструмент для решения данной задачи. shell -- как раз такой инструмент.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, aeropunk, Вы писали:
A>Спасибо! Да, использование default shell — это лучший из имеющихся у меня вариантов. A>Но еще красивее было бы решить задачу без его использования.
Требования к разбиению строки на аргументы описаны в соответствующем разделе POSIX, и поэтому вполне можно полагаться на default shell.
A>М.б. все-таки есть библиотека?
В Unix для многих вещей библиотеки отсуствуют. За ненадобностью.
E>Задачка состоит в том, чтобы нарезать командную строку, полученную из конфигурационного файла на отдельные аргументы для последующей передачи этих агрументов в один из 6 вызовов семейства exec. Как это сделать? Хочется воспользоваться чем-нибудь уже готовым и лучше всего системным, чтобы не пришлось отлавливать потом баги в очередной сторонней библиотеке.
E>Т.е., раз exec, значит нужно запустить новый процесс вместо старого. Тогда вообще ничего мудрить не нужно -- через exec зовем shell и скармливаем ему всю строку параметров, без fork-а.
E>Или же не вся задача была озвучена.
Скажем так, задача имеет два направления: практическое и общепознавательное.
Естественным образом практическое направление имеет для меня более высокий приоритет.
Поэтому если не будет найдено другое решение, я реализую fork — execv c вызовом default shell, которому будет передано 2 параметра: -с и ищеющиеся из конфигурационного файла параметры. Т.е. собственно "назерка" будет изящно обойдена. Для решения практической части задачи это будет вполне достаточно.
С общепознавательной т.з. может потребоваться в самой программе иметь нарезку командной строки (не своей, а какой угодно). Здесь опять может сработать фокус с default shell. Для этого достаточно написать простенькую программку, которая будет (в общем случае не важно каким образом) отсылать родителю свои собственные аргументы, полученные из main. Но породжение нового процесса для этой цели с моей т.з. выглядит несколько тяжеловесно.
P.S. Прошу прощения, fork конечно же подразумевался.
Здравствуйте, 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 библиотека, решающая эту задачу.
Не. Каждый шел решает ее по своему к сожалению.
Здравствуйте, aeropunk, Вы писали:
A>Здравствуйте, eao197, Вы писали:
A>Поэтому если не будет найдено другое решение, я реализую fork — execv c вызовом default shell, которому будет передано 2 параметра: -с и ищеющиеся из конфигурационного файла параметры. Т.е. собственно "назерка" будет изящно обойдена. Для решения практической части задачи это будет вполне достаточно.
Тем более, что это уже реализовано:
#include <stdlib.h>
system(const char* command);
А насчет нарезки — стоило бы посмотреть как эта самая нарезка реализована в исходниках вашего default shell-a