Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: triplek в May 19, 2008, 13:23



Титла: Присвояване на системна команда на стринг
Публикувано от: triplek в May 19, 2008, 13:23
Здравейте,

Как мога на променлива стринг да присвоя примерно изхода от system("ls /нещо/си"); ?

Също как се прави изхода от system("нещо/си") да не се изобразява при стартиране на програмата?

10х предварително


Титла: Присвояване на системна команда на стринг
Публикувано от: sdr в May 19, 2008, 14:05
Правиш два пайпа
Форкваш
В чайлда:
  Подменяш входизхода с пайповете
  Викаш Сиситем
В Парента
  Четеш от пайповете

Черпиш :)


Титла: Присвояване на системна команда на стринг
Публикувано от: zeridon в May 19, 2008, 14:45
sdr направо изби рибата. Не че не е вярно ама ... що така

triplek:
Примерен код
somevar='`somecomand with options`'

Примерен код
somecomand > /dev/null


Титла: Присвояване на системна команда на стринг
Публикувано от: task_struct в May 19, 2008, 15:31
Пример тук във функцията void process(FILE *f, char *cl);.

Също така и в програмата на gat3way има пример.


Титла: Присвояване на системна команда на стринг
Публикувано от: triplek в May 19, 2008, 16:05
sdr, Би ли конкретизирал точно какво имаш предвид с някакъв примерен код;

zeridon, Аз ли не правя нещо както трябва? На изхода получавам само една ` кавичка.  :crazy:


Титла: Присвояване на системна команда на стринг
Публикувано от: 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 когато форкнатия процес приключи. Струва ми се, че си пропуснал да затвориш някой от краищата на пайпа.