主题:一个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循环是什么时候退出的?
谢谢
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循环是什么时候退出的?
谢谢