go - 为什么 mustSendSIGSEGV() 会继续打印,而 syscall.Kill(pid, syscall.SIGSEGV) 只打印一次

标签 go cgo

谁能告诉我为什么 syscall.Kill(pid, syscall.SIGSEGV) 只打印一次 "handlerSIGSEGV Sent by 0" ,但是 mustSendSIGSEGV 会打印 "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 %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)
    }
}

最佳答案

从“The Go Programming Language”我看到了这个:

如果非 Go 代码为任何同步信号(SIGBUS、SIGFPE、SIGSEGV)安装信号处理程序,那么它应该记录现有的 Go 信号处理程序。如果这些信号在执行 Go 代码时发生,它应该调用 Go 信号处理程序(信号是否在执行 Go 代码时发生可以通过查看传递给信号处理程序的 PC 来确定)。否则,一些 Go 运行时 panic 将不会按预期发生。

关于go - 为什么 mustSendSIGSEGV() 会继续打印,而 syscall.Kill(pid, syscall.SIGSEGV) 只打印一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49560114/

相关文章:

JQuery POST 到 Golang 破坏字段名称

mysql - Golang动态绑定(bind)变量个数

在 Go 中更改 WebKitWebSettings cgo

c++ - 自从在 Golang 中删除了一些 C 之后,SWIG for go 是否已经过时了?

go - 是否可以返回指向 go 共享库中结构的指针?

c - 将结构体数组从 C 传递到 Golang

Cgo 可以调用在另一个目录中声明的 C 函数吗?

go - 如何使用 go 内部包中的统计函数 (MannWhitneyUTest)

ide - LiteIDE 没有自动完成

http - 每个应用程序需要多少个HTTP客户端?