| | |
| | | #include "usg_common.h" |
| | | #include "usg_typedef.h" |
| | | |
| | | int test(char *src, int size) { |
| | | int i = strlen(src); |
| | | char dest[size]; |
| | | strncpy(dest, src, size); |
| | | puts(dest); |
| | | return i; |
| | | static void sig_quit(int); |
| | | int |
| | | main(void) |
| | | { |
| | | sigset_t |
| | | newmask, oldmask, pendmask; |
| | | if (signal(SIGQUIT, sig_quit) == SIG_ERR) |
| | | err_exit(errno, "can’t catch SIGQUIT"); |
| | | /* |
| | | * Block SIGQUIT and save current signal mask. |
| | | */ |
| | | sigemptyset(&newmask); |
| | | sigaddset(&newmask, SIGQUIT); |
| | | if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) |
| | | err_exit(errno, "SIG_BLOCK error"); |
| | | sleep(5); |
| | | /* SIGQUIT here will remain pending */ |
| | | if (sigpending(&pendmask) < 0) |
| | | err_exit(errno, "sigpending error"); |
| | | if (sigismember(&pendmask, SIGQUIT)) |
| | | printf("\nSIGQUIT pending\n"); |
| | | /* |
| | | * Restore signal mask which unblocks SIGQUIT. |
| | | */ |
| | | if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) |
| | | err_exit(errno, "SIG_SETMASK error"); |
| | | printf("SIGQUIT unblocked\n"); |
| | | sleep(5); |
| | | exit(0); |
| | | /* SIGQUIT here will terminate with core file */ |
| | | } |
| | | int main() { |
| | | char *str = "hello"; |
| | | int r = test(str, strlen(str)); |
| | | printf("%d\n", r); |
| | | } |
| | | |
| | | static void sig_quit(int signo) |
| | | { |
| | | printf("caught SIGQUIT\n"); |
| | | if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) |
| | | err_exit(errno, "can’t reset SIGQUIT"); |
| | | } |