On Thu, Mar 29, 2018 at 6:34 PM, hexun via golang-nuts <golang-nuts@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+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.