LINUX.ORG.RU

popen


0

0

Хай пипель! Кто знает как проанализировать ситуацию, если в popen передана неверная командная строка? Если типа :

FILE * p = popen ( "adn", "w" );

то p <> NULL, т.к. шелл выполнится, но внешней команды "adn" нет.

★★

Re: popen

popen запускает команду вида

/bin/sh -c <command>

т.е. можно посмотреть её код возврата через $?

а можно поставить обработчик сигнала SIGPIPE и тупо считать что всё в порядке, т.е. писать/читать из канала, а после pclose проверить был ли broken pipe...

2PETER: а вообще чего хочется?

shandor ()

Re: popen

Вообще все делается на С/С++, поэтому всю инфу, которую читал из man 3 popen. Нужно выводить поток символов ( документ ) на печать вроде этого:

FILE * p = popen ( "iconv | lpr", "w"); fputs ( p, str ); pclose ( p );

Сорри, если где аргументы не так написал ( смысл ясен ), ну и у iconv, lpr тоже свои аргументы. Про /bin/sh -c и так ясно - в доке написано, но вся фигня в том, что не возвращается код заверешения. А если его и получить, например написав свою popen ( учерась нашел в инете как это делается у Ричарда Стивенса http://www.yendor.com/programming/unix/ ), то можно получить только код возврата самого шелла ( то что шелл выплевывает на stdout приходится "заземлять" на stderr, т.к. прога консольная с рюшечками - менюшечками). Ну и соответственно вышеуказанная комстрока "iconv |lpr" задается через конфиг приклады, так что хотелось бы отработать ситуацию если она неправильная. Вот чего хочется. Если у кого есть опыт борьбы с сим эффектом, поделитесь плиз

PETER ★★ ()

Re: popen

шелл возвращает 0 если всё в порядке и 127 если запукамая команда неверна...
а вобще : делаем fork запускаем execle в потомке и ждём в родителе пол-секунды , если после этого потомок не грохнулся, значит всё в порядке :)
вряд-ли получится как-то по другому, ведь popen порождает процесс, а если он запустился нормально, то пока он не закончится, получить его статус нереально...

если хочешь, могу написать небольшой код, но помойму тут всё банально

shandor ()

Re: popen

шелл возвращает 0 если всё в порядке и 127 если запукамая команда неверна...
а вобще : делаем fork запускаем execle в потомке и ждём в родителе пол-секунды , если после этого потомок не грохнулся, значит всё в порядке :)
вряд-ли получится как-то по другому, ведь popen порождает процесс, а если он запустился нормально, то пока он не закончится, получить его статус нереально...

если хочешь, могу написать небольшой код, но помойму тут всё банально

shandor ()

Re: popen

Да нет, спасибо, код не нужен, есть уже. Я думал, что испольуя popen, можно как-нить отловить эту ситуацию. Очевидно придется идти стандартно через fork. Сенкс за беспокойство.

PETER ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.