LINUX.ORG.RU

forkpty и read


0

0

Я инициализирую forkpty так:

...

childpid = forkpty(&mfd,buf,NULL,NULL);
if(childpid==0){
execve("/bin/sh","sh",NULL);
sleep(1);
exit(0);
}

...

Далее в коде таймера, мне необходимо считать с потока:

...
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_SET(master_fd, &rfds);
...
do{
err = select(master_fd+1,&rfds,&wfds,NULL,&tv);
}while(err < 0&& errno==EINTR);
if (FD_ISSET(master_fd, &rfds)){
do{
err=read(master_fd,buf,1024); // - здесь программа замерзает.
// .. - а здесь - обработка буфера.
}while(err<0 && errno==EINTR && FD_ISSET(master_fd,&wfds));
}
...

На строчке err=read(master_fd,buf,1024); программа замерзает, т.к. bash выдает меньше 1024 байта на чтение. Вопрос: как узнать, сколько байт поток подготовил на чтение, или например как "разморозить" read, когда входной поток пуст. Т.е. отключить блокирование процесса. Если файл открыт open'ом, то можно применить O_NDELAY. А как это сделать в случае с forkpty? Изменение атрибутов с помощью fcntl не дает результатов. :( Помогите пожалуйста.

Ответ на: комментарий от grustnoe

>вогнать терминал в неканоническую моду

Не понял :(. В "неканоническую моду" - ?.

SteelKey
() автор топика
Ответ на: комментарий от grustnoe

Ничего не понимаю!
Сделал я так:
struct termios t;
t.c_lflag&=ICANON;
t.c_cc[VMIN]=0;
t.c_cc[VTIME]=0;
и передал ts в качестве параметра для forkpty, но read все равно мерзнет. Кто-нибудь, попробуйте этот способ на своей системе, пожалуйста! А то может быть у меня система кривая (хотя вряд ли, но...) :(

SteelKey
() автор топика
Ответ на: комментарий от grustnoe

>~ICANON, а не ICANON.
Я так и писал.
>ты на master или slave side of pty делал?
К стыду своему не знаю чем они отличаются :(.

SteelKey
() автор топика
Ответ на: комментарий от grustnoe

Это я просто очепятался когда набирал мессагу. По-прежнему не работает. :(

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