popen()

13 отговора 574 прегледа
#1

popen()

Здравейте. Правя си програмка на kylix която се явява GUI на едно конзолно приложение и за целта се опитах да използвам функцията popen(), обаче се сбълъсках с един проблем - мога да използвам функцията само за четене или само за запис. Интересува ме мога ли да я ползвам с rw mode? Ако не е възможно бихте ли ми казали някакъв друг начин.
Благодаря

Отговор
в отговор на deso #2

Re: popen()

pipe() ? Или др. вариант. 2 ф-ии popen() - една за четене и една за писане. В Буилдера има _popen() но тази ф-я не не ANSI C съвместима. Ако пишеш на Паскал не мога нищо да кажа по въпроса.
Между другото на какъв Linux си подкарал кайликса ? Преди години пробвах с ред хат 8 или 9, не помня вече и не успях.

Отговор
в отговор на Veso #3

Re: popen()

Линукса е Debian sarge 3.1 с Kylix 3. Ами ако следвам идеята ти бих искал да знам как ще стане следното:
конзолното приложение изписва да кажем:
>> hello user
>> please enter your password: (и тука чака за парола)
ГУИ приложението трява да въведе парола....

Ако използвам 2 функции попен ще имам 2 инстанции на конзолното приложение, което в моя случай не ми върши никаква рабора .
Доста се порових из нет-а и намерих продбни работи, но така написани, че честно казано не можах да схвана смисъла им.

Отговор
в отговор на deso #4

Re: popen()

Не разбрах защо са нужни две инстанции на конзолното приложение. В най-лошия случай можеш да ползваш два треда, но дори итова не виждам защо ти е. Командния ред трябва да чете(блокиран) от канала докато се получат данни от GUI-то. Защо ти е да пишеш? Искаш да пращаш съобщения до GUI-то ли?

Отговор
в отговор на zzfe #5

Re: popen()

Добре... понеже нещо не ме разбра правилно ще ти кажа точно какво се мъча да направя та дано тогава да ме разбереш. (не съм искал да ползвам 2 попен)
Целта ми е да направя ГУИ на sftp, понеже много често ми с налага да го ползвам а ме мързи да пиша ;). За това предпочитам да цъкам с мишката ;))
sftp-то връща (резултати от дадена команда) и приема (команди и парола :)) данни от конзолата. Та има ли начин да ползвам функция попен и ако има как?

Отговор
в отговор на deso #6

Re: popen()

Няма начин с popen(), но можеш да си направиш pipe(), после да се fork()-неш, в child-а да си dup2()-неш двата дескриптора където трябва, след което да си exec()-неш квото там трябва да тича.

Отговор
в отговор на пeшo #7

Re: popen()

Пардон, ще ме прощаваш ;) - трябват ти 2 pipe()-а значи - от единия да четеш, а в другия да пишеш.

Отговор
в отговор на deso #8

ако говориш Perl

мога да ти изпратя код който прави точно това (т.е. прави GUI на конзолна програма). Мисля че може да се преведе на произволен език...

Отговор
в отговор на deso #9

Re: popen()

expect + tk = expectk

[линк]
[линк]

RTFM!
--sdg
Отговор
в отговор на deso #10

Re: popen()

popen() е само еднопосочен. Обаче може да нaправиш друго:

1. Отваряш tcp сокет A и го слагаш в - non-blocking режим.
2. fork().
3. pаrent процеса изчаква връзка на socket A от child процеса и го връща в blocking режим. Изчакването трябва да стане със listen() + select() понеже сокета е non-blocking.
3. child процеса затваря сокет A.
4. child процеса отваря tcp сокет B и го свързва със сокет A.
5. child процеса затваря файлови дескриптори 0, 1 и 2. На тяхно място дупликира сокет B.
6. child процеса прави exec на програмата, която те интересува.

Цялата бъркотия с non-blocking режима е за избягването на race condition между parent/child процесите. На практика получаваш двупосочен tcp pipe. За ip адрес на tcp сокетите може да ползваш 127.0.0.1

Отговор
в отговор на Penguin #11

Re: popen()

И защо да не използва директно pipe вместо socket?

Отговор
в отговор на darklord #12

Re: ако говориш Perl

Не говоря, но чета ;) . Няма да е лошо да хвърля един поглед на нещо работещо. пиши на д.мичев@гмаил.ком

Отговор
в отговор на l #13

Re: popen()

Пайповете са еднопосочни. За двупосочна комуникация ще му трябват 2 пайпа вместо 1 tcp сокет.

Отговор
в отговор на Penguin #14

Re: popen()

А защо трябва комуникацията да е през един файл? Какво му е лошото на стандартния метод с два пайпа?

Отговор