首页 > 解决方案 > dlang 是否默认安装一些信号处理程序

问题描述

我有用 D 编写的无限循环程序:

$ cat dprog.d 
import std.stdio;
import core.thread;

void main()
{
  while(1){
    Thread.sleep(dur!("seconds")(1));
  };
}

当我在 Linux (Ubuntu) 上构建和运行这个程序时,kill -10 $PID对它没有任何影响。事实上,默认情况下它确实捕获了一堆信号:

$ cat /proc/$PID/status | grep SigCgt
SigCgt: 0000000180000a00

信号 10 是一个SIGUSR1信号,其默认操作是进程终止(请参阅man 7 signal)。

用 C 语言编写的等效程序终止于kill -10 $PID并且它cat /proc/$PID/status | grep SigCgtSigCgt: 0000000000000000.

用 Rust 编写的等效程序也终止于kill -10 $PID,但它cat /proc/$PID/status | grep SigCgtSigCgt: 0000000180000440.

我的问题是:D (Rust) 编译器是否注册了默认信号处理程序?如果是,为什么?另外,这是否记录在某处?

标签: linuxsignalsd

解决方案


core.thread.thread_setGCSignals的文档告诉我们,在 Posix 系统上,SIGUSR1 和 SIGUSR2 用于运行时以控制挂起和恢复线程以用于 GC 目的。

此功能允许您更改使用的信号,以防您不需要不同的信号。


推荐阅读