《深入理解计算机系统》之家庭作业8.25题答案

#include "csapp.h"


static sigjmp_buf env; //当调用sigsetjmp函数时将当前调用环境保存在缓冲区env中,以供后面siglongjum使用


/*
** handler:一个信号处理程序
*/
static void handler(int sig)
{
Alarm(0);  //如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的secs值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。
siglongjmp(env, 1); //当控制到达这里时执行跳转,即重新跳回sigsetjmp处继续执行,此时sigsetjmp返回非零
}




char *tfgets( char *s, int size, FILE *stream )
{
Signal( SIGALRM, handler ); //当内核向alarm函数的调用进程发送一个信号时,捕获该信号


Alarm(5);  //alarm函数在5秒内向调用进程发送一个SIGALRM信号


/*
** 如果用户在5秒内执行了输入,则alarm函数不会发送信号,那么信号处理函数handler也就不会执行,
** 即不会发生非本地跳转,于是sigsetjmp返回0,程序执行Fgets,tfgets函数返回指向输入行的指针。
** 反之,如果用户超过5秒没有输入,则alarm函数发送信号,调用进程捕获该信号并执行handler函数,
** 于是发生非本地跳转,sigsetjmp返回非零,tfgets函数返回NULL。
** 
*/
if( sigsetjmp(env, 1) == 0 )  //设定一个可以被信号处理程序使用的非本地跳转,设定成功后sigsetjmp返回0
return ( Fgets(s, size, stream) );
else
return NULL;
}




int main()
{
char buf[MAXLINE];


while(1)
{
/*
** 关于bzero函数:
** 原型:extern void bzero(void *s, int n);
** 参数说明:s是要置零的数据的起始地址; n是要置零的数据字节个数。
                ** 用法:#include
                ** 功能:置字节字符串s的前n个字节为零且包括‘\0’。
** 说明:bzero无返回值
*/
bzero(buf, MAXLINE); //将字符数组buf全部清零


if( tfgets(buf, sizeof(buf), stdin) != NULL )
printf( "read:%s\n", buf );
else
printf( "timed out\n" ); //超时
}
exit(0);
}

你可能感兴趣的:(cc++,linux)