То ли у меня лыжи не едут, то ли я чего-то недопонимаю.
Мне нужно открыть псевдотерминал, который бы работал в каноничном режиме и опрашивать его через poll()
делаю так:
int pty_init(char* path){
int mfd = posix_openpt(O_RDWR|O_NOCTTY);
tty_init( mfd, 115200);
grantpt(mfd);
unlockpt(mfd);
char* slave_name = ptsname(mfd);
if( slave_name == NULL ){
syslog(LOG_ERR, "Can't get slave name. Abort.");
return -1;
}
int fd = open(path,O_RDWR|O_TRUNC|O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
if( fd == -1 ){
syslog(LOG_ERR, "Can't open file to write slave name. Abort.");
return -1;
}
write(fd, slave_name, strlen(slave_name));
close(fd);
return mfd;
}
это открытие псевдотерминала
struct termios ts_old;
if( tcgetattr( fd, &ts_old) != 0 ){
return -1;
}
ts_old.c_iflag |= ( IXOFF | IGNPAR | ICRNL );
ts_old.c_cflag |= ( CLOCAL | CREAD | CS8 );
ts_old.c_lflag = ICANON ;
ts_old.c_oflag = 0;
ts_old.c_cc[VMIN] = 0;
ts_old.c_cc[VTIME] = 10;
tcflush(fd, TCIOFLUSH);
tcsetattr( fd, TCSANOW, &ts_old );
установка режима
struct pollfd pfd[3];
pfd[0].fd = ctx.pty;
pfd[0].events = POLLIN | POLLOUT;
...
result = poll(pfd,3, 1000 );
...
if( pfd[0].revents & POLLIN ){
...
// тут обработка ввода из псевдотерминала
...
}
///
Вопрос в том, что несмотря на выставленный флаг ICANON, poll возвращает флаг POLLIN на буфер не заканчивающийся переводом строки.
Я же хотел бы получать POLLOUT в revents только после того, как в терминале нажмут enter.