首页 >后端开发 >Golang >Go:获取信号源

Go:获取信号源

王林
王林转载
2024-02-12 08:30:09843浏览

Go:获取信号源

php小编百草推荐的一款实用工具是Go:获取信号源。这款工具可以帮助开发者获取信号源的相关信息,包括信号强度、信号类型、运营商等。通过使用该工具,开发者可以方便地进行信号测试和优化,提升用户体验。同时,该工具还提供了丰富的功能选项,如信号图表展示、信号变化监测等,让开发者能够更加全面地了解信号情况,从而更好地进行调试和优化工作。无论是移动应用开发还是网络优化,Go:获取信号源都是一款实用的工具。

问题内容

我正在使用 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 语言执行此操作,但我对此会非常谨慎(请参阅诸如 问题/7227)。您可能最好使用信号以外的其他通信方法。

以下是基于问题 7227 中 ian 代码的部分示例:

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:获取信号源的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除