2008-10-23 5 views
2

В программе C (p1), как запустить динамически сконструированную команду (и ее аргументы), которая считывает свой стандартный ввод из стандартного вывода p1?В ** портативном C **, как запустить команду, соединяющую stdin команды с STDU запуска?

Обратите внимание, что:

  1. Способ кроме этого стандартный вывод -> STDIN трубопроводов также хорошо при условии это PORTABLE через Windows, и Linux .

  2. Я не могу использовать C++, Java, Perl, Ruby, Python и т. Д. Здесь.

Также будет ли иметь зависимость MinGW для его сборки Windows?

REOPENED: Вопрос ниже отвечает за Linux, но этот вопрос требует переносного метода. Execute program from within a C program

+0

Обратите внимание, что я бы предпочел только решение C. (Извините за неудобство!) – user10955 2008-10-23 14:42:47

ответ

2

Это не на 100% ясно, что вы пытаетесь достичь, чтобы быть честным.

Но, как я понимаю, вы могли бы взглянуть на Boost.Process

Вы можете сделать такие вещи, как

bp::child cs = p.start(); 
bp::postream& os = cs.get_stdin(); 

И затем использовать ОС в любом потоке, чтобы сбросить вещи в стандартный ввод вашего дочернего процесса.

В любом случае, огромная часть может быть достигнута с помощью библиотеки w.r.t. перенаправление и цепочка труб.

+0

Хм, усиление. 800-фунтовая горилла, которую мне нужно будет связать и пожать друг другу руки. Я все равно буду следить за любыми легкими, С-ответами. Спасибо хоть. (Обратите внимание, что теперь я отбрасываю C++ из условия.) – user10955 2008-10-23 14:37:24

1

Связанный ансер (который вы отвергаете) относится к POSIX-трубам. POSIX - это расширение для C, которое добавляет функции, отсутствующие в стандартном C. Каналы POSIX являются хорошим примером такой функции: они были добавлены в POSIX, поскольку стандарт C не имеет такой функциональности.

4

Среда выполнения Microsoft C называет ее _popen вместо popen, но, похоже, она имеет одинаковую функциональность в Windows (для консольных приложений) и Linux.

1

Библиотека glib написана на C и имеет реализации, которые хорошо протестированы как на Linux, так и на Windows. The manual section on spawning new processes предоставит вам информацию о том, как запустить новый процесс и подключить его дескрипторы stdin и stdout с помощью вызова g_spawn_async_with_pipes.