hush for non-mmu system
Waldemar Brodkorb
wbx at openadk.org
Tue Sep 2 16:21:47 UTC 2014
Hi Denys,
Denys Vlasenko wrote,
> This shows that signal handler fails to return properly.
> Let's check whether it works with this simple program:
>
> #include <unistd.h>
> #include <signal.h>
> #include <sys/types.h>
> #include <sys/wait.h>
> static void sighandler(int sig)
> {
> write(1, "SIGNAL\n", 7);
> }
> int main()
> {
> int pid;
>
> write(1, "VFORK1\n", 7);
> pid = vfork();
> if (pid == 0) {
> write(1, "EXIT1\n", 6);
> _exit(1);
> }
> wait(NULL);
> signal(SIGCHLD, sighandler);
> write(1, "VFORK2\n", 7);
> pid = vfork();
> if (pid == 0) {
> write(1, "EXIT2\n", 6);
> _exit(1);
> }
> wait(NULL);
> write(1, "EXIT\n", 5);
> return 0;
> }
>
> On my machine, it works like this:
> i.e. signal handler did not mess up the parent.
>
> What do you see?
I see:
/> /sighandler
VFORK1
EXIT1
VFORK2
EXIT2
SIGNAL
/> strace -f /sighandler
VFORK1
EXIT1
wait4(-1, NULL, 0, NULL) = 44
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=44,
si_status=1, si_utime=0, si_stime=0} ---
rt_sigaction(SIGCHLD, {0x41eae080, [CHLD], SA_RESTART}, {SIG_DFL,
[], 0}, 8) = 0
write(1, "VFORK2\n", 7VFORK2
) = 7
vfork(Process 45 attached
<unfinished ...>
[pid 45] write(1, "EXIT2\n", 6EXIT2
) = 6
[pid 45] _exit(1) = ?
[pid 43] <... vfork resumed> ) = 45
[pid 43] wait4(-1, <unfinished ...>
[pid 45] +++ exited with 1 +++
<... wait4 resumed> NULL, 0, NULL) = 45
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=45,
si_status=1, si_utime=0, si_stime=0} ---
write(1, "SIGNAL\n", 7SIGNAL
) = 7
sigreturn() (mask [HUP TRAP]) = 45
rt_sigreturn() = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---
+++ killed by SIGSEGV +++
/>
best regards
Waldemar
More information about the busybox
mailing list