popen()
13 отговора
574 прегледа
popen()
Здравейте. Правя си програмка на kylix която се явява GUI на едно конзолно приложение и за целта се опитах да използвам функцията popen(), обаче се сбълъсках с един проблем - мога да използвам функцията само за четене или само за запис. Интересува ме мога ли да я ползвам с rw mode? Ако не е възможно бихте ли ми казали някакъв друг начин.
Благодаря
Благодаря
Re: popen()
pipe() ? Или др. вариант. 2 ф-ии popen() - една за четене и една за писане. В Буилдера има _popen() но тази ф-я не не ANSI C съвместима. Ако пишеш на Паскал не мога нищо да кажа по въпроса.
Между другото на какъв Linux си подкарал кайликса ? Преди години пробвах с ред хат 8 или 9, не помня вече и не успях.
Между другото на какъв Linux си подкарал кайликса ? Преди години пробвах с ред хат 8 или 9, не помня вече и не успях.
Re: popen()
Линукса е Debian sarge 3.1 с Kylix 3. Ами ако следвам идеята ти бих искал да знам как ще стане следното:
конзолното приложение изписва да кажем:
>> hello user
>> please enter your password: (и тука чака за парола)
ГУИ приложението трява да въведе парола....
Ако използвам 2 функции попен ще имам 2 инстанции на конзолното приложение, което в моя случай не ми върши никаква рабора
.
Доста се порових из нет-а и намерих продбни работи, но така написани, че честно казано не можах да схвана смисъла им.
конзолното приложение изписва да кажем:
>> hello user
>> please enter your password: (и тука чака за парола)
ГУИ приложението трява да въведе парола....
Ако използвам 2 функции попен ще имам 2 инстанции на конзолното приложение, което в моя случай не ми върши никаква рабора
Доста се порових из нет-а и намерих продбни работи, но така написани, че честно казано не можах да схвана смисъла им.
Re: popen()
Не разбрах защо са нужни две инстанции на конзолното приложение. В най-лошия случай можеш да ползваш два треда, но дори итова не виждам защо ти е. Командния ред трябва да чете(блокиран) от канала докато се получат данни от GUI-то. Защо ти е да пишеш? Искаш да пращаш съобщения до GUI-то ли?
Re: popen()
Добре... понеже нещо не ме разбра правилно ще ти кажа точно какво се мъча да направя та дано тогава да ме разбереш. (не съм искал да ползвам 2 попен)
Целта ми е да направя ГУИ на sftp, понеже много често ми с налага да го ползвам а ме мързи да пиша ;). За това предпочитам да цъкам с мишката ;))
sftp-то връща (резултати от дадена команда) и приема (команди и парола :)) данни от конзолата. Та има ли начин да ползвам функция попен и ако има как?
Целта ми е да направя ГУИ на sftp, понеже много често ми с налага да го ползвам а ме мързи да пиша ;). За това предпочитам да цъкам с мишката ;))
sftp-то връща (резултати от дадена команда) и приема (команди и парола :)) данни от конзолата. Та има ли начин да ползвам функция попен и ако има как?
Re: popen()
Няма начин с popen(), но можеш да си направиш pipe(), после да се fork()-неш, в child-а да си dup2()-неш двата дескриптора където трябва, след което да си exec()-неш квото там трябва да тича.
Re: popen()
Пардон, ще ме прощаваш ;) - трябват ти 2 pipe()-а значи - от единия да четеш, а в другия да пишеш.
ако говориш Perl
мога да ти изпратя код който прави точно това (т.е. прави GUI на конзолна програма). Мисля че може да се преведе на произволен език...
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
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
Re: ако говориш Perl
Не говоря, но чета ;) . Няма да е лошо да хвърля един поглед на нещо работещо. пиши на д.мичев@гмаил.ком
Re: popen()
Пайповете са еднопосочни. За двупосочна комуникация ще му трябват 2 пайпа вместо 1 tcp сокет.
Re: popen()
А защо трябва комуникацията да е през един файл? Какво му е лошото на стандартния метод с два пайпа?