假设我正在执行Go中的kill
程序。我可以接受来自命令行的数字信号和PID,并将它们发送到syscall.Kill
没有问题。如何在Go中以跨平台方式按名称列出可用的操作系统信号?
但是,我不知道如何实现信号分配的“字符串”形式,例如, kill -INT 12345
。
真实用例是一个较大程序的一部分,它提示用户发送杀死信号;不是kill
的替代品。
问:
我如何转换有效信号名称的任何支持的平台上的数字信号,在运行时(或至少不按平台编写代码在编译时运行)?
我已经试过什么:
- 保持信号名称的静态映射到数字。这不能以跨平台的方式工作(例如,不同的信号列表在Mac OSX上由
kill -l
返回,而现代Linux与旧版Linux比较)。使这个解决方案一般工作的唯一方法是为每个操作系统制作地图,这需要我了解每个操作系统的行为,并随时添加新的信号支持。 - 将GNU
kill
工具封装出来并从中捕获信号列表。这是不雅观的,有点悖论,还需要a)能够找到kill
,b)具有执行子进程的能力/权限,以及c)能够预测/解析kill
-binary的输出。 - 使用各种
Signal
类型的'String
方法。这只是返回包含信号编号的字符串,例如os.Signal(4).String() == "signal 4"
,这是没有用的。 - 调用私人功能
runtime.signame
,这正是我想要的。go://linkname
黑客会工作,但我认为这种事情是由于某种原因而皱起了眉头。
理念/事情我还没有尝试过:
- 使用CGO莫名其妙。我宁愿不冒险进入CGO领域,因为这个项目本来就不是低层次/需要本地整合的项目。如果这是唯一的选择,我会,但不知道从哪里开始。
- 使用模板和代码生成在编译时根据外部源生成信号列表。由于与CGo相同的原因,这不是可取的。
- 反映并解析以
SIG
开头的syscall
的成员。我被告知,这是不可能的,因为名字被编辑掉了;是否有可能,对于像信号名称这样重要的东西,有一些地方他们不是编译掉?
难道不可能调用'strsignal'和/或使用'sys_siglist'数组吗? –
潜在的;我给了它一个镜头,但之前没有使用过Cgo,所以它始终无法将输出值存储在我使用的go结构中。如果我到任何地方,我会一直捅它并贴在这里;你知道任何示例代码吗? –
在C:'for(int i = 0; i