LINUX.ORG.RU

pty и каноничный режим


0

1

То ли у меня лыжи не едут, то ли я чего-то недопонимаю.

Мне нужно открыть псевдотерминал, который бы работал в каноничном режиме и опрашивать его через 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.

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