LINUX.ORG.RU

popen


0

0

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

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

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

★★

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

/bin/sh -c <command>

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

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

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

shandor
()

Вообще все делается на С/С++, поэтому всю инфу, которую читал из 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 ★★
() автор топика

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

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

shandor
()

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

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

shandor
()

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

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