当前位置: 首页 > 面试题库 >

转到:获取信号来源

樊飞飙
2023-03-14
问题内容

我正在使用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)
    }
}


 类似资料:
  • 问题内容: 我想获取连接到手机的另一台设备的蓝牙信号强度, 如何获得蓝牙信号强度? 我试图在Google上进行大量搜索,但未找到任何答案。 有人知道我该如何实施吗? 这是myActivity: 我的清单文件中也有蓝牙许可。 问题答案: 要获取信号,您可以检查蓝牙RSSI,可以阅读已连接设备的RSSI,或执行蓝牙发现以检查附近任何设备的RSSI。 基本上,蓝牙发现是向范围内的所有电台广播以进行响应。

  • 问题内容: 有谁知道是否有可能获得有关设备范围内所有蜂窝塔的信息?只是能够获得它们的位置或有关它们的任何其他信息,以及我将如何去做? 问题答案: 这是从当前网络状态获取基站信号塔ID(CID)和lac(位置区号)的方法: 之后获取Lat,Lng位置信息比较麻烦。这是指向有关Symbian的帖子的链接,但涉及到Cell Tower-> Lat,Lng转换:http ://discussion.for

  • 问题内容: 我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…) 我认为要做的方法是使用以下命令在go例程中启动节点服务器: 然后,我想捕获由执行的命令生成的所有可能的信号。我是Go的新手,我们将不胜感激。 问题答案: Go中有三种执行程序的方式: 包含syscall.Exec,syscall.Fork

  • 本文向大家介绍微信公众号-获取用户信息(网页授权获取)实现步骤,包括了微信公众号-获取用户信息(网页授权获取)实现步骤的使用技巧和注意事项,需要的朋友参考一下 根据微信公众号开发官方文档: 获取用户信息步骤如下: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信息(需s

  • 在AUTOSYS服务器中,我们有一堆java进程要在不同的时间调度运行。大多数java进程没有exit语句,因此我们很少像shell脚本那样编写stop作业来终止在预定停止时间运行的进程。当我们杀死这些进程时,Autosys的作业状态被设置为终止,因此我们将不正常地接收到警报。 是否有任何UNIX命令可以平稳地退出进程,以便将AUTOSYS状态更改为SU(成功)?.

  • 问题内容: 我正在使用以下软件包:os / exec http://golang.org/pkg/os/exec/在操作系统中执行命令,但我似乎找不到获取退出代码的方法。我虽然可以阅读输出 即。 问题答案: 很容易确定退出代码是0还是其他。在第一种情况下,将返回nil(除非在设置管道时出现另一个错误)。 不幸的是,在错误的情况下,没有独立于平台的方法来获取退出代码。这也是它不属于API的原因。以下