I really want to when call handlerSIGSEGV end, it will continue back to golang ,then golang will recover it.. Is there anyway? 在 2018年3月30日星期五 UTC+8下午2:20:23,Ian Lance Taylor写道: > > On Thu, Mar 29, 2018 at 6:34 PM, hexun via golang-nuts > <golan...@googlegroups.com <javascript:>> wrote: > > 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? > > When you install your own SIGSEGV handler, you are replacing the Go > handler. > > You can't really modify the Go handler. You can use the os/signal > package to catch a SIGSEGV signal sent to the process, but it won't > catch a SIGSEGV caused by the process. > > What are you really trying to do? > > Ian > > > > > 在 2018年3月30日星期五 UTC+8上午12:42:42,Ian Lance Taylor写道: > >> > >> On Thu, Mar 29, 2018 at 8:48 AM, hexun via golang-nuts > >> <golan...@googlegroups.com> 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 golang-nuts...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/d/optout. >
-- 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 golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.