gpt4 book ai didi

Go:获取信号来源

转载 作者:IT王子 更新时间:2023-10-29 01:09:04 25 4
gpt4 key购买 nike

我正在使用 Go 启动几个脚本,当它们遇到问题时,它们会使用“警报”信号,我知道 Go 可以捕获这些信号,但我需要知道发出信号的 PID。在 C 中,向信号处理程序传递了一个结构,以了解发出信号的 pid,但在 Go 中看起来并非如此

package main

import (
"fmt"
"os"
"os/signal"
)

func main() {

c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill)

s := <-c
fmt.Println("Got signal:", s)
fmt.Printf("%+v\n",s)
}

下面的示例(从信号文档中提取)向我发送了发起调用的信号,但没有任何有用的信息(如 pid)

最佳答案

不,您不能以官方支持的方式执行此操作。 Go 运行时需要拥有信号处理程序,并且不会以任何方式公开这些额外信息。

您仍然可以通过设置新的信号处理程序从 C 中执行此操作,但我会对此非常谨慎(参见 issue/7227 等问题)。您最好使用信号以外的其他通信方法。

下面是一个基于 Ian 在问题 7227 中的代码的部分示例:

package main

/*
#include <stdio.h>
#include <signal.h>
#include <string.h>

struct sigaction old_action;
void handler(int signum, siginfo_t *info, void *context) {
printf("Sent by %d\n", info->si_pid);
}

void test() {
struct sigaction action;
sigaction(SIGUSR1, NULL, &action);
memset(&action, 0, sizeof action);
sigfillset(&action.sa_mask);
action.sa_sigaction = handler;
action.sa_flags = SA_NOCLDSTOP | SA_SIGINFO | SA_ONSTACK;
sigaction(SIGUSR1, &action, &old_action);
}
*/
import "C"

import (
"os"
"syscall"
"time"
)

func main() {
C.test()
pid := os.Getpid()
for {
syscall.Kill(pid, syscall.SIGUSR1)
time.Sleep(time.Second)
}
}

关于Go:获取信号来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30219751/

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