为什么必须继续打印,而syscall.kill(pid,syscall.sigsegv)为什么只打印一次



任何人都可以告诉我为什么syscall.Kill(pid, syscall.SIGSEGV)仅打印"handlerSIGSEGV Sent by 0"一次,但是必须打印"handlerSIGSEGV Sent by 0"无限时间。

我想要Golang Sigsegv通行到C,只能处理一次,而不是很多次。谁能帮我吗?

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 %dn", 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)
    }
}

来自" Go编程语言",我看到了:

如果非GO代码安装了任何同步信号(Sigbus,Sigfpe,Sigsegv(的信号处理程序,则应记录现有的GO信号处理程序。如果执行GO代码时发生这些信号,则应调用GO信号处理程序(是否在执行GO代码时发生信号,可以通过查看传递给信号处理程序的PC来确定(。否则某些GO运行时恐慌将不会如预期的那样发生。

最新更新