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.

Reply via email to