Титла: Присвояване на системна команда на стринг Публикувано от: triplek в May 19, 2008, 13:23 Здравейте,
Как мога на променлива стринг да присвоя примерно изхода от system("ls /нещо/си"); ? Също как се прави изхода от system("нещо/си") да не се изобразява при стартиране на програмата? 10х предварително Титла: Присвояване на системна команда на стринг Публикувано от: sdr в May 19, 2008, 14:05 Правиш два пайпа
Форкваш В чайлда: Подменяш входизхода с пайповете Викаш Сиситем В Парента Четеш от пайповете Черпиш ![]() Титла: Присвояване на системна команда на стринг Публикувано от: zeridon в May 19, 2008, 14:45 sdr направо изби рибата. Не че не е вярно ама ... що така
triplek:
Титла: Присвояване на системна команда на стринг Публикувано от: task_struct в May 19, 2008, 15:31 Пример тук във функцията void process(FILE *f, char *cl);.
Също така и в програмата на gat3way има пример. Титла: Присвояване на системна команда на стринг Публикувано от: triplek в May 19, 2008, 16:05 sdr, Би ли конкретизирал точно какво имаш предвид с някакъв примерен код;
zeridon, Аз ли не правя нещо както трябва? На изхода получавам само една ` кавичка. ![]() Титла: Присвояване на системна команда на стринг Публикувано от: gat3way в May 19, 2008, 16:09 А, той примерът там е много лош, не случайно съм сложил такъв коментар отгоре на функцията.
Принципно идеята да се форква процес и с dup2 да се клонира pipe-а към стандартния изход е добра, лошото е че има един кофти страничен случай, в който това дето го викаш с system() не изписва нито един байт на стандартния изход. Тъй като по дефолт четенето не е non-blocking, родителският процес ще кисне вечно, чакайки да се изчете нещо от пайпа. Обаче ако го изтресеш в non-blocking режим с fcntl(), тогава идват други проблеми, ще трябва да циклиш, четеш и лепиш стрингове за да стигнеш до крайният резултат. Титла: Присвояване на системна команда на стринг Публикувано от: tarator в May 19, 2008, 16:57 Има функция, която прави форкването и dup автоматично -- popen.
Титла: Присвояване на системна команда на стринг Публикувано от: sdr в May 19, 2008, 23:58 Интересно сега се чудя дали не може да се избегне от страничния случай с някво ехо преди това ... или пък да се сетне една алармица ... и ..
п.с. Преди да свършиш в чайлда може да си пишеш до парента и така най-чисто се решава проблема Титла: Присвояване на системна команда на стринг Публикувано от: tarator в May 20, 2008, 00:48 gat3way,
Мисля, че нещо си се объркал. Ако всичко е направено както трябва, родителя ще получи грешка/EOF когато форкнатия процес приключи. Струва ми се, че си пропуснал да затвориш някой от краищата на пайпа. |