Наш текущий проект основан на расширении more
включением прокрутки. Для этого необходимо установить интервал таймера на определенный период. Часть, в которой я не уверен, - где должна быть петля для сигнала тревоги. Все примеры, которые я видел, имеют значения таймера в основном, а затем явно вызывают обработчик сигнала через pause()
в бесконечном цикле while.
Мой код немного отличается, так как требования к функциональности похожи на
print first screen of text after getting terminal dimensions
print prompt
if prompt = space, print another screen of text //WORKS
if prompe = q, restore original terminal settings & quit program //WORKS
if prompt = ENTER, initialize scroll at 1 line every 2 seconds //DOESN'T WORK
if prompt == f/s, increase/decrease scroll speed by 20% //DOESN'T WORK
Чтение в буфере, указатель файла и структура itimerval являются глобальными переменными, чтобы избежать передачи в качестве аргументов через цепочку функций.
Основная функция программы
void processInput(FILE *fp){
void printLine(int); //prints a single line of text
signal(SIGPROF, printLine);
int c;
//print first screen of text, check for more text to display
info(); //print prompt at bottom of screen
FILE *fterm= fopen("/dev/tty", "r");
while ((c=getc(fterm)) != EOF){
if (c== '\n'){
setTimer(2);
//four more conditionals like this in basic similarity
}
}
Моя функция setTimer имеет базовый интервал, равный 2 секундам, и меняет его на плюс / минус 20% в зависимости от значения f / s от пользователя.
void setTimer(int direction){
int speed=2000000; //2 seconds
int change= 400000; //400 milliseconds, 20% of 2 seconds
if (direction == 1) //slow down by 20%
speed+= change;
if (direction == 0)
speed -= change;
timer.it_value.tv_sec=2;
timer.it_value.tv_usec=0;
timer.it_interval.tv_sec=0;
timer.it_interval.tv_usec= speed;
setitimer(ITIMER_PROF, &timer, NULL);
}
Первый вопрос: я должен использовать SIGALRM против SIGPROF и соответственно изменить переменную ITIMER_XXXX?
Во-вторых, где я должен поставить петлю для запуска сигнала? Я пытался
while(1)
pause();
в некоторых условных выражениях, но это привело к остановке выполнения и игнорированию любого ввода.