func mustSendSIGSEGV(){
defer func() {
if err := recover(); err != nil {
fmt.Print("enter recover 111")
// logger.PrintPanicStack()
}
}()
var r *Test
r.Num = 0
}
i rewrite mustSendSIGSEGV like this。it is same as before.. how to modify
the default Go SIGSEGV handler?
在 2018年3月30日星期五 UTC+8上午12:42:42,Ian Lance Taylor写道:
>
> On Thu, Mar 29, 2018 at 8:48 AM, hexun via golang-nuts
> <[email protected] <javascript:>> wrote:
> > From "The Go Programming Language" I see this:
> >
> > If the non-Go code installs any signal handlers, it must use the
> SA_ONSTACK
> > flag with sigaction. Failing to do so is likely to cause the program to
> > crash if the signal is received.
> >
> >
> >
> >
> > Can any one tell me why syscall.Kill(pid, syscall.SIGSEGV) only print
> > "handlerSIGSEGV Sent by 0" once ,but mustSendSIGSEGV will print
> > "handlerSIGSEGV Sent by 0" Unlimited times。 I want golang SIGSEGV pass
> to c
> > ,only handle once ,not many times.can anyone help me?
> > package main
> > /*
> > #include <stdio.h>
> > #include <signal.h>
> > #include <string.h>
> >
> > struct sigaction old_action;
> >
> >
> > void handlerSIGSEGV(int signum, siginfo_t *info, void *context) {
> > printf("handlerSIGSEGV Sent by %d\n", info->si_pid);
> > }
> >
> >
> >
> > void testSIGSEGV() {
> > struct sigaction action;
> > sigaction(SIGSEGV, NULL, &action);
> > memset(&action, 0, sizeof action);
> > sigfillset(&action.sa_mask);
> > action.sa_sigaction = handlerSIGSEGV;
> > action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO | SA_ONSTACK;
> > sigaction(SIGSEGV, &action, &old_action);
> > }
> > */
> > import "C"
> >
> > import (
> > "os"
> > "syscall"
> > "time"
> > "fmt"
> > )
> > type Test struct {
> > Num int
> > }
> >
> > func mustSendSIGSEGV(){
> > var r *Test
> > r.Num = 0
> > }
> >
> > func main() {
> > // C.test()
> > C.testSIGSEGV()
> > pid := os.Getpid()
> > syscall.Kill(pid, syscall.SIGSEGV)
> > // mustSendSIGSEGV()
> > for {
> > // syscall.Kill(pid, syscall.SIGUSR1)
> > fmt.Print("33")
> > time.Sleep(time.Second)
> > }
> > }
>
> Your SIGSEGV handler just returns, which means that the program
> resumes execution at the point of failure. In your mustSendSIGSEGV
> function you haven't done anything to fix the code, so it just gets
> another SIGSEGV.
>
> Note that the default Go SIGSEGV handler does not simply return. It
> panics.
>
> Ian
>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.