Получение размера терминала при работе с «часами» в Linux - PullRequest
1 голос
/ 13 января 2020

У меня есть эта простая тестовая программа:

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

int main(int argc, char *argv[], char *envp[])
{
    struct winsize w;
    if (!ioctl(fileno(stdout), TIOCGWINSZ, &w)) {
        printf("width %d\n", w.ws_col);
    } else {
        printf("%s", strerror(errno));
    }
    return 0;
}

, которая, если она запускается с самого терминала, возвращает размер окна терминала, но по какой-то причине, если она запускается с помощью команды watch, он просто завершается с ошибкой в ​​ioctl (), который возвращает НЕПРАВИЛЬНЫЙ IOCTL ДЛЯ УСТРОЙСТВА.

Есть идеи почему? Какой самый надежный способ получить размер окна терминала?

1 Ответ

1 голос
/ 13 января 2020

Дело в том, что стандартный вывод вашей программы - это уже не терминал, а канал до watch, который будет собирать выходные данные программы и отображать их. Таким образом, вы не можете определить ширину из файлового дескриптора stdout.

stdin, однако, все еще подключен к терминалу, поэтому вы можете использовать fileno(stdin) вместо этого, чтобы получить правильный размер терминала:

if (!ioctl(fileno(stdin), TIOCGWINSZ, &w)) {
    printf("width %d\n", w.ws_col);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...