2017-04-05 9 views
1

X가 머리글을 표시 할 때마다 X 줄마다 머리글을 표시하려고합니다. 마지막 줄이 화면에서 벗어날 때 머리글이 표시됩니다. 사용자는 터미널 크기를 변경할 수 있으며 프로그램은 대답을 알아야합니다. 뭔가 약Unix/Linux에서 C로 터미널 높이를 동적으로 결정하는 가장 좋은 방법은 무엇입니까?

i = get_lines()+1; 
while (1) { 
    if (i > get_lines()) { 
     printf("header"); 
     i = 0; 
    } else { 
     i++; 
    } 
    do_stuff(); 
} 

답변

1

처럼 당신은 TIOCGWINSZ와 현재 터미널의 높이를 읽을 수 있습니다

#include <sys/ioctl.h> /* needed for lines */ 
#include <signal.h> /* needed for lines */ 
#include <stdio.h>  /* needed for printf */ 
#include <time.h>  /* needed for sleep */ 

unsigned short lines; 
static void get_lines(int signo) { 
    struct winsize ws; 
    ioctl(fileno(stdout), TIOCGWINSZ, &ws); 
    lines = ws.ws_row; 
} 

int main(int argc, char** argv) { 
    int i; 
    struct timespec ts; 

    get_lines(SIGWINCH); 
    signal(SIGWINCH, get_lines); 

    i = lines; 
    while (1) { 
     if (i >= lines) { 
      printf("header\n"); 
      i = 3; /* 3 not 1 because header + last empty line */ 
     } else { 
      i++; 
     } 
     printf("line\n"); 
     ts.tv_sec = 0; 
     ts.tv_nsec = 500000000; 
     nanosleep(&ts, NULL); 
    } 
} 

라인의 수는 ws.ws_row에 지금이다.

사용자가 터미널 크기를 변경하면 (즉, 터미널 창의 크기를 조정할 때) SIGWINCH이 포 그라운드 프로세스로 전송됩니다. 따라서이 이벤트에 대해 신호 처리기을 설정하고 창 크기를 다시 읽어야합니다.

+0

감사합니다. 이것은 정확히 내가 필요한 것과 같습니다. –