On Thu, Mar 29, 2018 at 11:29 PM, hexun via golang-nuts <golang-nuts@googlegroups.com> 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+unsubscr...@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+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.