Я инициализирую 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 не дает результатов. :( Помогите пожалуйста.