gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:11:50 27 4
gpt4 key购买 nike

谁能告诉我为什么 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com