| #include <features.h> |
| #include <fpu_control.h> |
| #include <signal.h> |
| #include <sys/types.h> |
| #include <signal.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <ucontext.h> |
| #include <unistd.h> |
| |
| void handle_SIG(int sig) |
| { |
| double d; |
| |
| _FPU_SETCW(0); |
| d = 7; |
| asm volatile ("":: "f" (d)); |
| printf("Got signal %d\n", sig); |
| if (sig == SIGSEGV) { |
| printf("SIGSEGV, exiting...\n"); |
| exit(0); |
| } |
| } |
| |
| void handle_rt_SIG(int sig, siginfo_t *info, void *uc) |
| { |
| double d; |
| |
| _FPU_SETCW(0); |
| d = 8; |
| asm volatile ("":: "f" (d)); |
| printf("Got signal %d\n", sig); |
| printf("si_signo: %d\n", info->si_signo); |
| printf("si_errno: %d\n", info->si_errno); |
| printf("si_code: %d\n", info->si_code); |
| if (sig == SIGSEGV) { |
| printf("SIGSEGV, exiting...\n"); |
| exit(0); |
| } |
| } |
| |
| int main(void) |
| { |
| // char *a; |
| struct sigaction sa; |
| double d1,d2,d3,d4,d5; |
| |
| _FPU_SETCW(1); |
| d1 = d2 = d3 = d4 = d5 = 1; |
| sa.sa_sigaction=handle_rt_SIG; |
| sa.sa_flags =SA_SIGINFO; |
| sigemptyset(&sa.sa_mask); |
| sigaction(SIGALRM, &sa, NULL); |
| signal(SIGUSR1, handle_SIG); |
| signal(SIGSEGV, handle_SIG); |
| kill(getpid(), SIGALRM); |
| printf("One!\n"); |
| kill(getpid(), SIGUSR1); |
| printf("floating point is now: %f %f %f %f %f\n", d1, d2, d3, d4, d5); |
| { |
| int fpc; |
| _FPU_GETCW(fpc); |
| printf("fpc= %d\n", fpc); |
| } |
| printf("Good Bye!\n"); |
| // a = (char *) 0x12345678; |
| // *a = 1; |
| exit(0); |
| } |