Я инициализирую 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 не дает результатов. :( Помогите пожалуйста.
Ответ на:
комментарий
от SteelKey
Ответ на:
комментарий
от SteelKey
Ответ на:
комментарий
от grustnoe
Ответ на:
комментарий
от grustnoe
Ответ на:
комментарий
от SteelKey
Ответ на:
комментарий
от grustnoe
Ответ на:
комментарий
от SteelKey
Ответ на:
комментарий
от grustnoe
Ответ на:
комментарий
от SteelKey
Ответ на:
комментарий
от grustnoe
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Помогите найти ошибку в следующем коде!!! (2004)
- Форум select (2006)
- Форум чтение fifo (2006)
- Форум вопрос про select() (2013)
- Форум сокет. получить данные (2007)
- Форум select, FD_ISSET, socket, тупняк (2010)
- Форум помогите с select/pipe, плииииз... (2003)
- Форум помогите с select/pipe, плииииз... (2003)
- Форум select и non-blocking fifo (2007)
- Форум [embedded] поллинг файлового дескриптора (2010)