【发布时间】:2014-01-06 00:30:29
【问题描述】:
我有一个来自(旧)教科书的程序,旨在说明 POSIX 信号在 UNIX 上的使用。该程序运行一个计算循环来计算从一个固定点开始的完美数。
- 时间警报信号用于定期打印状态。
- 中断信号用于按需状态。
- 退出信号用于重置测试间隔(或终止)。
void perfect(int);
sigjmp_buf jmpenv; /* environment saved by setjmp*/
int n; /* global variable indicating current test point */
int main() {
int begin; /* starting point for next search*/
/* interrupt routines*/
void status();
void query();
sigset_t mask;
struct sigaction action;
if (sigsetjmp(jmpenv,0)) {
printf("Enter search starting point (0 to terminate): ");
scanf("%d",&begin);
if (begin==0) exit(0);
sigprocmask(SIG_UNBLOCK, &mask, NULL);
}
else begin=2;
/* Status Routine will handle timer and INTR */
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
sigaddset(&mask, SIGALRM);
sigaddset(&mask, SIGQUIT);
action.sa_flags=0;
action.sa_mask=mask;
action.sa_handler=status;
sigaction(SIGINT,&action,NULL);
sigaction(SIGALRM,&action,NULL);
action.sa_handler=query;
sigaction(SIGQUIT,&action,NULL);
/* start alarm clock */
alarm(20);
perfect(begin);
}
void perfect(start)
int start;
{
int i,sum;
n=start;
while (1) {
sum=1;
for (i=2;i<n;i++)
if (!(n%i)) sum+=i;
if (sum==n) printf("%d is perfect\n",n);
n++;
}
}
void status(signum)
int signum;
{
alarm(0); /* shutoff alarm */
if (signum == SIGINT) printf("Interrupt ");
if (signum == SIGALRM) printf("Timer ");
printf("processing %d\n",n);
alarm(20); /*restart alarm*/
}
void query() {siglongjmp(jmpenv,1);}
我的问题是:
- 为什么会调用 void status();和无效查询();一开始主要是?
- 在 if 语句检查 begin == 0 并决定退出后,它遵循名为“sigprocmask(SIG_UNBLOCK, &mask, NULL);”的行为什么我退出后还要解锁?
【问题讨论】:
-
你到底在做什么写 K&R 风格(非原型)的函数定义?除了使用原型符号之外,永远不要编写新代码! (至少,你需要解释为什么这可能是必要的;支持 POSIX 的平台没有不支持原型的 C 编译器,所以你必须非常有说服力地谈论。)
-
@JonathanLeffler 我没有编写函数。这是书中的代码,我正在努力理解它。