У меня есть терминал работает псевдо на Linux, C, который был открыт, как показано:Использование termios() для замены EOF?
else
{
struct termios slave_orig_term_settings; // Saved terminal settings
struct termios new_term_settings; // Current terminal settings
// CHILD
close(fdm);
rc = tcgetattr(fds, &slave_orig_term_settings);
new_term_settings = slave_orig_term_settings;
new_term_settings.c_cc[VEOF] = '|';
new_term_settings.c_oflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ISIG | ICRNL);
cfmakeraw (&new_term_settings);
tcsetattr (fds, TCSANOW, &new_term_settings);
}
При чтении из трубы, можно сделать не блокирующем чтения(), которая будет возвращать после того, как, например, 5 секунд. Проблема в том, что если я выполняю команду типа «ls», которая возвращается в течение нескольких мс, она будет ждать полные 5 секунд перед возвратом.
Я понимаю, что с помощью физического терминала GUI, а не для терминала psuedo, пользователь может нажать CTRL^D и отправить EOF в конце каждого вывода.
Я хочу этот эффект, поэтому моя программа может сказать «ОК, я получил этот определенный байт, что означает, что терминал завершен, и теперь я могу вернуть этот вывод обратно вызывающему, и я знаю, что нет больше вывода для чтения ".
Я понимаю, что это делается с помощью функции termios() (или это оболочка stty), но я не могу заставить ее работать. Я хочу, чтобы терминал послал мне '|' char вместо ctrl^d (\ x04) после завершения вывода, но он не работает.
Для ясности, после завершения вывода (через read()), я хочу получить '|' байт. Так что, если я посылаю команду «PWD», я получаю этот выход:
$ pwd
/home/user/dir
$|
Может кто-то пожалуйста, скажите мне, как изменить этот код, чтобы достигнуть того эффекта?
Благодарим за помощь.
EDIT - выберите код()
while ((bytes = select(pipe + 1, &fd_in, NULL, NULL, &tv)))
{
if (FD_ISSET(pipe, &fd_in))
{
read (pipe...)
Поведение выше кода, как я описал, ждать полной стоимости ТВ, даже если нет ничего на трубе, прежде чем вернуться ,
Параметр '.c_cc [VEOF]' специальный символ используется только в режиме "канонической" ('ICANON' бит установлен в' .c_lflags'), но 'cfmakeraw' устанавливает "сырой" режим (' ICANON' бит не задано). –