@Radon
2014-12-03T17:51:04.000000Z
字数 478
阅读 1305
未分类
A. fork
B. execve longjmp
C. setjmp
当父进程处理第一个信号时,内核就会阻塞这个信号,第二个信号依然可以发送,之后的三个信号会被丢弃。
#include <stdio.h>#include <signal.h>#include <setjmp.h>#include <unistd.h>sigjmp_buf env;void handler(int sig){signal(SIGALRM, SIG_DFL);siglongjmp(env, 1);}char *tfgets(char *buf, int bufsize, FILE *stream){signal(SIGALRM, handler);alarm(5);int rc = sigsetjmp(env, 1);if(rc == 0)return fgets(buf, bufsize, stream);else return NULL;}int main() {char S[100];if (tfgets(S, 100, stdin)) {printf("%s", S);}return 0;}