YES.how to preserve the old one,i want use it to go back to golang,then golang should recover it.
在 2018年3月30日星期五 UTC+8下午2:52:20,Ian Lance Taylor写道: > > On Thu, Mar 29, 2018 at 11:29 PM, hexun via golang-nuts > <golan...@googlegroups.com <javascript:>> wrote: > > > > I really want to when call handlerSIGSEGV end, it will continue back to > > golang ,then golang will recover it.. Is there anyway? > > Yes, there is a way. When you install your signal handler, preserve > the old one. After doing whatever processing you want, call the old > signal handler before returning. > > But is that really what you want to do? This sounds like an XY > problem (https://en.wikipedia.org/wiki/XY_problem). > > Ian > > > > > 在 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> 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. > >> > 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...@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.