回 帖 发 新 帖 刷新版面

主题:一个sigsetjmp()的小程序,不太理解其原理,请大家指教

static sigjmp_buf jmpbuf;
signal(SIGALRM, recvfrom_alarm);
while (fgets(sendline, MAXLINE, fp) != NULL) {
sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
alarm(5);
for ( ; ; ) {
if (sigsetjmp(jmpbuf, 1) != 0)
break;
len = servlen;
n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);
sigprocmask(SIG_BLOCK,…);
recvline[n] = 0; /* null terminate */
printf("from %s: %s",
Sock_ntop_host(preply_addr, len), recvline);
sigprocmask(SIG_SETMASK,…);
}
}
static void recvfrom_alarm(int signo)
{
siglongjmp(jmpbuf, 1);
}
请问
1 程序里sigsetjmp 和siglongjmp的作用是什么?
2 for循环是什么时候退出的?
谢谢

回复列表 (共1个回复)

沙发

Sophisticated Program Control: sigsetjmp and siglongjmp 

consider the following control flow problems: 
  if blocking a ctrl-c during a complex calculation, where to transfer program control when the calculation is complete? 
  how to restart a dialog when the user enters an erroneous response somewhere several nested-menus deep? 

C programs use signals (indirectly or directly) to address these situations 

resembles exception-handling in OO languages and systems 

also similar to the call/cc construct of Scheme 

indirect approach 

  signal handler sets a flag 
  program tests that flag in strategic places 
  complex: program might have to return through several layers of functions 

direct approach: use sigsetjmp and siglongjmp 
  sigsetjump is like a statement label 
  siglongjmp is like a goto 
  difference is that this pair of functions cleans up (unravels) the program stack and signal states in addition to transferring control 
  sigsetjump takes an env parameter of type sigjmp_buf to store the context 
  siglongjump takes env to restore the context and an int val to simulate the return of sigsetjump 


Copied from 
[url]http://academic.udayton.edu/SaverioPerugini/courses/cps445/lectures/20060329.html[/url]

我来回复

您尚未登录,请登录后再回复。点此登录或注册