【发布时间】:2011-04-09 12:02:37
【问题描述】:
我们当前的项目基于通过包含滚动扩展 more。为此,必须为特定时间段设置定时器间隔。我不确定的部分是警报信号的循环应该在哪里。我见过的所有示例在 main 中都有计时器值,然后在无限循环中通过 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 struct都是全局变量,以避免作为参数通过函数链传递。
程序的主要功能是
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 还是 SIGPROF,并相应地更改 ITIMER_XXXX 变量?
其次,我应该在哪里放置循环来触发信号?我试过了
while(1)
pause();
在几个条件句中,但它具有停止执行并忽略任何输入的效果。
【问题讨论】: