Использование IPC – трубы
На днях на IRC кто-то спросил меня, как он должен идти о вызове внешней программы, отправка его ввода и получения продукции. Проблема в том, что он не контролирует внешнюю программу. Эта программа будет ожидать данных через стандартный ввод и вывод обработки на стандартный вывод.
Парень, представляется довольно путать о том, как все это работает и как это сделать и поэтому я решил написать небольшой учебник о нем.
Первая эту проблему лучше всего осуществляются с помощью труб. Вы должны быть очень знакомы труб из пользовательской точки зрения, с момента, когда вы используете оболочку. Например:
Найти /-INAME *. TXT | меньше
Вот найти выход подается по трубам к менее (1), потому что , вероятно, тысячи TXT файлов в вашей системе, и вы не хотите, чтобы результаты были потеряны в устройстве для истории.
При написании программы процесс очень много же. Вы можете создать труб (), вилка () и вызвать оболочка для программы, которую вы хотите писать или читать. Теперь вместо того, чтобы назвать все эти функции можно просто звонить popen (), которая делает все это для вас и возвращает указатель FILE приятный для вас использовать.
Вопросов, которые могут запутать новых пользователей является то, что трубы могут быть написаны только для чтения. Это не является большой проблемой, когда вы прочитали инструкцию, как вы увидите, что (из-за разветвления) на стандартный вывод ребенка такая же, со стандартным выводом из родителей.
Итак, вернемся к исходной задаче, я создал два примера программ, которые пытаются показать, как весь этот процесс работает.
Первая программа называется ребенка и после ее начала он ожидает один ввода символов с помощью стандартного ввода и эхо назад читал ввода в шестнадцатеричной системе.
Вторая программа, родитель, ребенок звонки через popen () и подает ее алфавита вторя вернуть то, что дочерний процесс печатает на стандартный вывод.
Это должно быть очень прямо вперед, но, пожалуйста, не стесняйтесь размещать какие-либо вопросы, вы можете столкнуться.
Ребенка:
# включить тап_п ( ) ( INT CH = 0 ; делать ( сп = деЬспаг ( ) ; Е ( "Got 0x% 0,2 X п " , ч ) ; (# )) , а ( сп! = 0 ) ; возвращение 0 (# ); )
Родитель:
# включить тап_п (# ) ( ) ( FILE * р = NULL ; INT CH; р = (# ) popen ( ". / ребенок" , "ш" ) ; если ( == р NULL ) возвращение 1 ; на ( сп = '' ; сп < 'г' , CH + + ) ( , если ( сп! = fputc ( ч, р ) ) перейти заблуждение, ) сп = 0 ; , если ( сп! = fputc ( ч, р ) ) перейти заблуждение, ошибаться: pclose ( р ) ; возвращение ч; ) Выход:
$ GCC-г-Wall-о child.c ребенок $ GCC-г-Wall-о parent.c родителей $. / parentGot 0×61Got 0×62Got 0×63Got 0×64Got 0×65Got 0×66Got 0×67Got 0×68Got 0×69Got 0×6AGot 0×6BGot 0×6CGot 0×6DGot 0×6EGot 0×6FGot 0×70Got 0×71Got 0×72Got 0×73Got 0×74Got 0×75Got 0×76Got 0×77Got 0×00 0×78Got 0×79Got
linuxexposed.com
Комментарии
Комментировать