URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8476
[ Назад ]

Исходное сообщение
"запуск программы из си с возвратом значения"

Отправлено the_skif , 12-Окт-09 17:25 
здравствуйте
подскажите как из чистого си вызвать nix программу с атрибутами, и главное получить то, что программа пишет в консоль запихать в переменную (однострочный результат, хотелось бы запихнуть в char*).


Содержание

Сообщения в этом обсуждении
"запуск программы из си с возвратом значения"
Отправлено the_skif , 12-Окт-09 17:28 
и/или как провернуть такое с python скриптом (хотелось бы знать оба варианта. 1й предпочтительнее)

"запуск программы из си с возвратом значения"
Отправлено L0n3R4ng3r , 12-Окт-09 17:40 
>и/или как провернуть такое с python скриптом (хотелось бы знать оба варианта.
>1й предпочтительнее)

ф-ция system().


"запуск программы из си с возвратом значения"
Отправлено the_skif , 12-Окт-09 20:24 
>>и/или как провернуть такое с python скриптом (хотелось бы знать оба варианта.
>>1й предпочтительнее)
>
>ф-ция system().

Функция system передает заданную строку string к интерпре-
татору команд и обрабатывает эту строку как команду MS DOS. Функ-
ция system ссылается на переменные окружения COMSPEC и PATH, что-
бы расположить файл COMMAND.COM, который используется при выпол-
нении команды string.

Если string успешно отработала, функция system возвращает
значение 0. Возвращаемое значение -1 свидетельствует об ошибке и
errno устанавливается в одно из следующих значений...

это не то, что мне нужно


"запуск программы из си с возвратом значения"
Отправлено аноним , 12-Окт-09 20:44 
>Функция system передает заданную строку string к интерпре-
>татору команд и обрабатывает эту строку как команду MS DOS. Функ-
>ция system ссылается на переменные окружения COMSPEC и PATH, что-
>бы расположить файл COMMAND.COM, который используется при выпол-
>нении команды string.

Какой нахрен command.com?

>это не то, что мне нужно

Ничто не будет возвращать char*, потому что это был бы идиотизм. На нижнем уровне это делается через pipe+fork (переправляем stdout/stderr в pipe в ребенке, в родителе читаем сколько надо) + wait. popen это все фактически обертывает в одну функцию.


"запуск программы из си с возвратом значения"
Отправлено аноним , 12-Окт-09 20:04 
>подскажите как из чистого си вызвать nix программу с атрибутами, и главное
>получить то, что программа пишет в консоль запихать в переменную (однострочный
>результат, хотелось бы запихнуть в char*).

popen


"запуск программы из си с возвратом значения"
Отправлено the_skif , 13-Окт-09 14:12 

>popen

спасибо

сделал так

  OutStream = popen(cmd, "r");
  BashCmdResult = fgets(buffer,40,OutStream);


"стандартная задача"
Отправлено Вова , 12-Окт-09 21:37 
>здравствуйте
>подскажите как из чистого си вызвать nix программу с атрибутами, и главное
>получить то, что программа пишет в консоль запихать в переменную (однострочный
>результат, хотелось бы запихнуть в char*).

простейший вариант, если не нужен вывод в stderr, это использование popen(), всё очень просто и красиво; о если же нужен и stderr, то  задача усложняется в разы: pipe() + fork() + dup(); если требуется ещё и контролировать коды возврата, придётся использовать и waitpid() пару раз (с NOHANG для чтения stdout/stderr из пайпов и без оного - для получения корректного кода возврата). И наличие данных в пайпах конечно нужно поллировать, чем душе угодно