Автор Тема: Присвояване на системна команда на стринг  (Прочетена 2438 пъти)

triplek

  • Напреднали
  • *****
  • Публикации: 564
    • Профил
Здравейте,

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

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

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

Debian Lenny/sid

sdr

  • Напреднали
  • *****
  • Публикации: 655
    • Профил
Правиш два пайпа
Форкваш
В чайлда:
  Подменяш входизхода с пайповете
  Викаш Сиситем
В Парента
  Четеш от пайповете

Черпиш '<img'>
Активен

zeridon

  • Killmode enabled
  • Administrator
  • Напреднали
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
sdr направо изби рибата. Не че не е вярно ама ... що така

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

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

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Пример тук във функцията void process(FILE *f, char *cl);.

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

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

triplek

  • Напреднали
  • *****
  • Публикации: 564
    • Профил
sdr, Би ли конкретизирал точно какво имаш предвид с някакъв примерен код;

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

Debian Lenny/sid

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
А, той примерът там е много лош, не случайно съм сложил такъв коментар отгоре на функцията.

Принципно идеята да се форква процес и с dup2 да се клонира pipe-а към стандартния изход е добра, лошото е че има един кофти страничен случай, в който това дето го викаш с system() не изписва  нито един байт на стандартния изход. Тъй като по дефолт четенето не е non-blocking, родителският процес ще кисне вечно, чакайки да се изчете нещо от пайпа.

Обаче ако го изтресеш в non-blocking режим с fcntl(), тогава идват други проблеми, ще трябва да циклиш, четеш и лепиш стрингове за да стигнеш до крайният резултат.
Активен

"Knowledge is power" - France is Bacon

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
Има функция, която прави форкването и dup автоматично -- popen.



Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

sdr

  • Напреднали
  • *****
  • Публикации: 655
    • Профил
Интересно сега се чудя дали не може да се избегне от страничния случай с някво ехо преди това ... или пък да се сетне една алармица ... и ..

п.с. Преди да свършиш в чайлда може да си пишеш до парента и така най-чисто се решава проблема



Активен

tarator

  • Напреднали
  • *****
  • Публикации: 849
    • Профил
gat3way,

Мисля, че нещо си се объркал. Ако всичко е направено както трябва, родителя ще получи грешка/EOF когато форкнатия процес приключи. Струва ми се, че си пропуснал да затвориш някой от краищата на пайпа.



Активен

A gentleman is one who is never rude unintentionally. - Noel Coward