diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-10-27 00:04:47 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2012-10-27 00:04:47 +0000 |
commit | 1ba327bd1c3e895675e7ab504af1064635fdf282 (patch) | |
tree | 615048fb87a55a2421efe353d061d0ded0d8eebf /apps/examples/elf/tests/signal/signal.c | |
parent | f1c2ce14060e4442dd59f6fa89e02b23c2d3989d (diff) | |
download | nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.tar.gz nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.tar.bz2 nuttx-1ba327bd1c3e895675e7ab504af1064635fdf282.zip |
The ELF loader is basically functional (needs more testing)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5265 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/examples/elf/tests/signal/signal.c')
-rw-r--r-- | apps/examples/elf/tests/signal/signal.c | 163 |
1 files changed, 60 insertions, 103 deletions
diff --git a/apps/examples/elf/tests/signal/signal.c b/apps/examples/elf/tests/signal/signal.c index 0d2e9e6cc..b40da7a86 100644 --- a/apps/examples/elf/tests/signal/signal.c +++ b/apps/examples/elf/tests/signal/signal.c @@ -38,6 +38,7 @@ ****************************************************************************/ #include <sys/types.h> + #include <stdio.h> #include <stdlib.h> #include <signal.h> @@ -66,22 +67,7 @@ static int sigusr2_rcvd = 0; ****************************************************************************/ /**************************************************************************** - * Name: sigusr1_sighandler - ****************************************************************************/ - -/* NOTE: it is necessary for functions that are referred to by function pointers - * pointer to be declared with global scope (at least for ARM). Otherwise, - * a relocation type that is not supported by ELF is generated by GCC. - */ - -void sigusr1_sighandler(int signo) -{ - printf("sigusr1_sighandler: Received SIGUSR1, signo=%d\n", signo); - sigusr1_rcvd = 1; -} - -/**************************************************************************** - * Name: sigusr2_sigaction + * Name: siguser_action ***************************************************************************/ /* NOTE: it is necessary for functions that are referred to by function pointers @@ -89,50 +75,33 @@ void sigusr1_sighandler(int signo) * a relocation type that is not supported by ELF is generated by GCC. */ -#ifdef __USE_POSIX199309 -void sigusr2_sigaction(int signo, siginfo_t *siginfo, void *arg) +void siguser_action(int signo, siginfo_t *siginfo, void *arg) { - printf("sigusr2_sigaction: Received SIGUSR2, signo=%d siginfo=%p arg=%p\n", + printf("siguser_action: Received signo=%d siginfo=%p arg=%p\n", signo, siginfo, arg); -#ifdef HAVE_SIGQUEUE + if (signo == SIGUSR1) + { + printf(" SIGUSR1 received\n"); + sigusr2_rcvd = 1; + } + else if (signo == SIGUSR2) + { + printf(" SIGUSR2 received\n"); + sigusr1_rcvd = 2; + } + else + { + printf(" ERROR: Unexpected signal\n"); + } + if (siginfo) { + printf("siginfo:\n"); printf(" si_signo = %d\n", siginfo->si_signo); - printf(" si_errno = %d\n", siginfo->si_errno); printf(" si_code = %d\n", siginfo->si_code); - printf(" si_pid = %d\n", siginfo->si_pid); - printf(" si_uid = %d\n", siginfo->si_uid); - printf(" si_status = %d\n", siginfo->si_status); - printf(" si_utime = %ld\n", (long)siginfo->si_utime); - printf(" si_stime = %ld\n", (long)siginfo->si_stime); printf(" si_value = %d\n", siginfo->si_value.sival_int); - printf(" si_int = %d\n", siginfo->si_int); - printf(" si_ptr = %p\n", siginfo->si_ptr); - printf(" si_addr = %p\n", siginfo->si_addr); - printf(" si_band = %ld\n", siginfo->si_band); - printf(" si_fd = %d\n", siginfo->si_fd); } -#endif - sigusr2_rcvd = 1; -} -#else -void sigusr2_sigaction(int signo) -{ - printf("sigusr2_sigaction: Received SIGUSR2, signo=%d\n", signo); - sigusr2_rcvd = 1; -} - -#endif - -/**************************************************************************** - * Name: sigusr2_sighandler - ****************************************************************************/ - -static void sigusr2_sighandler(int signo) -{ - printf("sigusr2_sighandler: Received SIGUSR2, signo=%d\n", signo); - sigusr2_rcvd = 1; } /**************************************************************************** @@ -146,39 +115,36 @@ static void sigusr2_sighandler(int signo) int main(int argc, char **argv) { struct sigaction act; - struct sigaction oact; - void (*old_sigusr1_sighandler)(int signo); - void (*old_sigusr2_sighandler)(int signo); + struct sigaction oact1; + struct sigaction oact2; pid_t mypid = getpid(); -#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE) - sigval_t sigval; -#endif + union sigval sigval; int status; printf("Setting up signal handlers from pid=%d\n", mypid); - /* Set up so that sigusr1_sighandler will respond to SIGUSR1 */ + /* Set up so that siguser_action will respond to SIGUSR1 */ - old_sigusr1_sighandler = signal(SIGUSR1, sigusr1_sighandler); - if (old_sigusr1_sighandler == SIG_ERR) + memset(&act, 0, sizeof(struct sigaction)); + act.sa_sigaction = siguser_action; + act.sa_flags = SA_SIGINFO; + + (void)sigemptyset(&act.sa_mask); + + status = sigaction(SIGUSR1, &act, &oact1); + if (status != 0) { fprintf(stderr, "Failed to install SIGUSR1 handler, errno=%d\n", errno); - exit(1); + exit(2); } - printf("Old SIGUSR1 sighandler at %p\n", old_sigusr1_sighandler); - printf("New SIGUSR1 sighandler at %p\n", sigusr1_sighandler); - - /* Set up so that sigusr2_sigaction will respond to SIGUSR2 */ - - memset(&act, 0, sizeof(struct sigaction)); - act.sa_sigaction = sigusr2_sigaction; - act.sa_flags = SA_SIGINFO; + printf("Old SIGUSR1 sighandler at %p\n", oact1.sa_handler); + printf("New SIGUSR1 sighandler at %p\n", siguser_action); - (void)sigemptyset(&act.sa_mask); + /* Set up so that siguser_action will respond to SIGUSR2 */ - status = sigaction(SIGUSR2, &act, &oact); + status = sigaction(SIGUSR2, &act, &oact2); if (status != 0) { fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n", @@ -186,18 +152,19 @@ int main(int argc, char **argv) exit(2); } - printf("Old SIGUSR2 sighandler at %p\n", oact.sa_handler); - printf("New SIGUSR2 sighandler at %p\n", sigusr2_sigaction); - printf("Raising SIGUSR1 from pid=%d\n", mypid); + printf("Old SIGUSR2 sighandler at %p\n", oact2.sa_handler); + printf("New SIGUSR2 sighandler at %p\n", siguser_action); + printf("Raising SIGUSR1 from pid=%d\n", mypid); fflush(stdout); usleep(SHORT_DELAY); - /* Send SIGUSR1 to ourselves via raise() */ + /* Send SIGUSR1 to ourselves via kill() */ - status = raise(SIGUSR1); + printf("Kill-ing SIGUSR1 from pid=%d\n", mypid); + status = kill(0, SIGUSR1); if (status != 0) { - fprintf(stderr, "Failed to raise SIGUSR1, errno=%d\n", errno); + fprintf(stderr, "Failed to kill SIGUSR1, errno=%d\n", errno); exit(3); } @@ -211,14 +178,14 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR1 not received\n"); exit(4); } + sigusr1_rcvd = 0; /* Send SIGUSR2 to ourselves */ - printf("Killing SIGUSR2 from pid=%d\n", mypid); + printf("sigqueue-ing SIGUSR2 from pid=%d\n", mypid); fflush(stdout); usleep(SHORT_DELAY); -#if defined(__USE_POSIX199309) && defined(HAVE_SIGQUEUE) /* Send SIGUSR2 to ourselves via sigqueue() */ sigval.sival_int = 87; @@ -230,20 +197,8 @@ int main(int argc, char **argv) } usleep(SHORT_DELAY); - printf("SIGUSR2 queued from pid=%d, sigval=97\n", mypid); -#else - /* Send SIGUSR2 to ourselves via kill() */ - - status = kill(mypid, SIGUSR2); - if (status != 0) - { - fprintf(stderr, "Failed to kill SIGUSR2, errno=%d\n", errno); - exit(5); - } + printf("SIGUSR2 queued from pid=%d, sigval=87\n", mypid); - usleep(SHORT_DELAY); - printf("SIGUSR2 killed from pid=%d\n", mypid); -#endif /* Verify that SIGUSR2 was received */ if (sigusr2_rcvd == 0) @@ -251,32 +206,33 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR2 not received\n"); exit(6); } + sigusr2_rcvd = 0; - /* Remove the sigusr2_sigaction handler and replace the SIGUSR2 + /* Remove the siguser_action handler and replace the SIGUSR2 * handler with sigusr2_sighandler. */ printf("Resetting SIGUSR2 signal handler from pid=%d\n", mypid); - old_sigusr2_sighandler = signal(SIGUSR2, sigusr2_sighandler); - if (old_sigusr2_sighandler == SIG_ERR) + status = sigaction(SIGUSR2, &oact2, &act); + if (status != 0) { - fprintf(stderr, "Failed to install SIGUSR2 handler, errno=%d\n", + fprintf(stderr, "Failed to install SIGUSR1 handler, errno=%d\n", errno); - exit(7); + exit(2); } - printf("Old SIGUSR2 sighandler at %p\n", old_sigusr2_sighandler); - printf("New SIGUSR2 sighandler at %p\n", sigusr2_sighandler); + printf("Old SIGUSR1 sighandler at %p\n", act.sa_handler); + printf("New SIGUSR1 sighandler at %p\n", oact1.sa_handler); - /* Verify that the handler that was removed was sigusr2_sigaction */ + /* Verify that the handler that was removed was siguser_action */ - if ((void*)old_sigusr2_sighandler != (void*)sigusr2_sigaction) + if ((void*)act.sa_handler != (void*)siguser_action) { fprintf(stderr, - "Old SIGUSR2 signhanlder (%p) is not sigusr2_sigation (%p)\n", - old_sigusr2_sighandler, sigusr2_sigaction); + "Old SIGUSR2 signal handler (%p) is not siguser_action (%p)\n", + act.sa_handler, siguser_action); exit(8); } @@ -302,6 +258,7 @@ int main(int argc, char **argv) fprintf(stderr, "SIGUSR2 not received\n"); exit(10); } + sigusr2_rcvd = 0; return 0; |