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.

Reply via email to