我們當前的項目基於通過包括滾動來擴展more
。爲此,定時器間隔必須設置一段時間。我不確定的部分是報警信號的迴路應該在哪裏。我見過的所有例子都有主值中的定時器值,然後通過無限循環中的pause()
明確調用信號處理程序。帶間隔計時器的故障
我的代碼是有點不同,因爲功能性要求去像
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秒的間隔基,和改變通過加/減基於從用戶F/S輸入的20%。
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 VS SIGPROF,並相應地改變ITIMER_XXXX變量?
其次,我應該在哪裏放置迴路來觸發信號?我試過
while(1)
pause();
在幾個條件中,但它具有停止執行和忽略任何輸入的效果。