Dlaczego polecenie „reset” zawiera opóźnienie?

17

resetPolecenia ma opóźnienie, pomiędzy ekran i usuwania powrotu. Dotyczy to nawet najnowszego typu terminala xterm-256color. Dlaczego?

man resetnie wspomina o opóźnieniu, a jedynie o drukowaniu specjalnych ciągów. (Nie wspomina również o wyczyszczeniu ekranu. Zakładam, że jest to uwzględnione w ciągu inicjalizacji terminala).

Zauważyłem następujące dane wyjściowe w strace -f reset:

nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffe1964f100) = 0
ioctl(2, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
sourcejedi
źródło

Odpowiedzi:

24

Potrzebują tego rzeczywiste (sprzętowe) terminale. Na przykład, w przypadku niektórych, jedynym sposobem na ich zresetowanie jest reset sprzętowy.

Jest nieszkodliwy z emulatorem terminala, a ponieważ nie ma konwencjonalnego sposobu na odróżnienie (i zbyt trudne do ustalenia, czy jakaś sekwencja Escape może spowodować reset sprzętowy), resetzakłada , że twój terminal jest prawdziwy.

Opóźnienie czasowe sięga tset3BSD w 1979 roku:

    /* output startup string */
    if (!RepOnly && !NoInit)
    {
            bufp = buf;
            if (tgetstr("is", &bufp) != 0)
                    prs(buf);
            bufp = buf;
            if (tgetstr("if", &bufp) != 0)
                    cat(buf);
            sleep(1);       /* let terminal settle down */
    }

To ewoluowało nieco w ncurses, ale przy użyciu tej samej wskazówki:

        if (!noinit) {
            if (send_init_strings(my_fd, &oldmode)) {
                (void) putc('\r', stderr);
                (void) fflush(stderr);
                (void) napms(1000);         /* Settle the terminal. */
            }
        }

Dalsza lektura:

Thomas Dickey
źródło
1
W kodzie OpenBSD oczekiwaniu 1000 ms (przez wywołanie napms(1000)) towarzyszy komentarz/* Settle the terminal. */
Kusalananda
2
OpenBSD używa ncurses.
Thomas Dickey,
1
Skoro jesteśmy tutaj, czy możesz wyjaśnić, jak usunąć opóźnienie, jeśli to możliwe?
user541686,
7
@Mehrdad Możesz spróbować tput reset. Wydaje się, że nie wykorzystuje opóźnienia.
Ross Ridge
3
@Mehrdad stty sanewydaje się naprawić pierwszy warunek bez żadnych opóźnień.
sourcejedi