LINUX.ORG.RU

послать символ конца строки


0

0

Здравствуйте, подксажите, чем имитировать ctrl+d в Си. не помню, 15 символ ascii или 13, но в любом случае, например
если я через popen открываю потоковый sed, который ожидает в
конце Ctrl+D, это не работает

FILE *fp;
fp=popen("sed -l -e 'какие-то  регекспы',"r+");
//тут идет обмен между пайпом и чтение из него
fgets(...)

// 
все идет нормально, но я не могу сказать sed-у что на
этом этап работы с ним завершен.
putc(N,fp)
где N - код feof (перепробовал 10-18, тк помню что кто-то из них ;)
не хочет.
В консоле если вызывать sed с теми же параметрам, он завершает чтение stdin при ^D

Спасибо
anonymous

Если close() делать почему-либо нельзя, то, наверное, спасет
(как меня недавно):

sed --unbuffered

Проблема в том, что, когда sed присасывается не к tty, а к пайпу,
то он не линейно буферизует, а блочно. Причем, _некоторые_ версии
sed'а начинают блочную буферизацию _вывода_ на tty, если _вход_
не на tty, это просто баг. Например, мой sed ему подвержен:

sed --version

GNU sed version 3.02.80

$cat|sed s/a/bg
asfc
dfswgfd
afdasf
^D
bsfc
dfswgfd
bfdbsf

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

У меня незнаю какой версии sed (-v/--version нету опции), идет
в комплекте с FreeBSD6.0

Все что связано с буферризацией - это буфер строчки
--
# man sed |grep buffered
     -l      Make output line buffered.
--
и при pipe я им пользуюсь.

Вообщем, как я понял, чтобы быть поменьше зависимым от
багов и версий sed (если конечно это баги) - лучше конец
строки слать свой собственный - fputs("EOF\n",fp);
и в цикле while (fgets..) просто делать проверку - если
есть EOF то break из цикла и pclose его нафик..

у меня баг не прошел:
# cat | sed  -e 's/a/bg/'
asdfa
bgsdfa
^D
#

anonymous
()
Ответ на: комментарий от Die-Hard

почему на чтение. popen("blablabla","r+");

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