Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 杀死Haskell二进制文件_Unix_Haskell - Fatal编程技术网

Unix 杀死Haskell二进制文件

Unix 杀死Haskell二进制文件,unix,haskell,Unix,Haskell,如果我按Ctrl+C,就会抛出一个异常(总是在线程0?)。如果您愿意,您可以捕捉到它——或者,更可能的是,运行一些清理,然后重新播放它。但通常的结果是以这样或那样的方式使程序停止 现在假设我使用Unixkill命令。据我所知,kill基本上是向指定进程发送一个(可配置的)Unix信号 Haskell RTS对此有何反应?它在什么地方有记录吗?我可以想象发送SIGTERM会有与按Ctrl+C相同的效果,但事实上我不知道 (当然,你可以使用kill来发送与杀戮毫无关系的信号。同样,我可以想象RTS会

如果我按Ctrl+C,就会抛出一个异常(总是在线程0?)。如果您愿意,您可以捕捉到它——或者,更可能的是,运行一些清理,然后重新播放它。但通常的结果是以这样或那样的方式使程序停止

现在假设我使用Unix
kill
命令。据我所知,
kill
基本上是向指定进程发送一个(可配置的)Unix信号

Haskell RTS对此有何反应?它在什么地方有记录吗?我可以想象发送
SIGTERM
会有与按Ctrl+C相同的效果,但事实上我不知道

(当然,你可以使用
kill
来发送与杀戮毫无关系的信号。同样,我可以想象RTS会忽略,比如说,
SIGHUP
SIGPWR
,但我不确定。)

谷歌搜索“haskell-catch-sigterm”让我想到了
unix
软件包,它有一个相当漂亮的系统来捕捉和处理这些信号。只需向下滚动到“处理信号”部分

编辑:一个简单的例子:

import System.Posix.Signals
导入控制。并发(线程延迟)
导入控制.Concurrent.MVar
termHandler::MVar()->Handler
termHandler v=CatchOnce$do
putStrLn“术语”
putMVar v()
循环::MVar()->IO()
循环v=do
putStrLn“仍在运行”
线程延迟1000000
val putStrLn“退出”>>返回()
无->循环v
main=do
v在github上搜索“信号”显示了以下功能:

void
initDefaultHandlers(void)
{
    struct sigaction action,oact;

    // install the SIGINT handler
    action.sa_handler = shutdown_handler;
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    if (sigaction(SIGINT, &action, &oact) != 0) {
sysErrorBelch("warning: failed to install SIGINT handler");
    }

#if defined(HAVE_SIGINTERRUPT)
    siginterrupt(SIGINT, 1);    // isn't this the default? --SDM
#endif

    // install the SIGFPE handler

    // In addition to handling SIGINT, also handle SIGFPE by ignoring it.
    // Apparently IEEE requires floating-point exceptions to be ignored by
    // default, but alpha-dec-osf3 doesn't seem to do so.

    // Commented out by SDM 2/7/2002: this causes an infinite loop on
    // some architectures when an integer division by zero occurs: we
    // don't recover from the floating point exception, and the
    // program just generates another one immediately.
#if 0
    action.sa_handler = SIG_IGN;
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    if (sigaction(SIGFPE, &action, &oact) != 0) {
    sysErrorBelch("warning: failed to install SIGFPE handler");
}
#endif

#ifdef alpha_HOST_ARCH
    ieee_set_fp_control(0);
#endif

    // ignore SIGPIPE; see #1619
    // actually, we use an empty signal handler rather than SIG_IGN,
    // so that SIGPIPE gets reset to its default behaviour on exec.
    action.sa_handler = empty_handler;
    sigemptyset(&action.sa_mask);
    action.sa_flags = 0;
    if (sigaction(SIGPIPE, &action, &oact) != 0) {
sysErrorBelch("warning: failed to install SIGPIPE handler");
    }

    set_sigtstp_action(rtsTrue);
}

由此可以看出,GHC至少安装了SIGINT和SIGPIPE处理程序。我不知道源代码中是否隐藏了其他信号处理程序

Ctrl-C发送
SIGINT
。我希望
SIGTERM
的处理方式与
SIGINT
不同。我认为Posix和/或特定系统定义的所有信号都有一个默认操作,请参见此处:(向下滚动到表格)。@bennofs很高兴知道。
SIGINT
的默认操作似乎是终止进程,但RTS显然会专门处理这个问题。如果知道是否有其他信号接收到特殊处理,那就太好了……我认为在GHC中,绑定线程接收到信号并调用一个注册的处理程序,该处理程序通知每个功能正常终止。附表.c第200行附近也有一些相关代码,grep表示“//中断/关闭序列。”(在这种情况下,最好的文档是代码本身)。如果我确实需要覆盖默认操作,那么这个库看起来非常相关。不过,我还是想知道这些默认值是什么我的错误。查看该模块的源代码也不会告诉我太多。我尝试了几种不同的信号,似乎当这些信号中的任何一个发送到该进程时,默认的操作就是停止该进程;你的信息看起来很有用。谢谢你!除此之外,我还看到System.Posix.Signals模块现在具有
raiseSignal
功能,可用于重新提升接收到的信号。通过使用
CatchInfo
CatchinfoOnce
您可以获得所需的信息,以传递给
raiseSignal
。所以你可以这样做,而不是使用MVar+循环。干得好。所以看来,
SIGINT
是唯一经过特殊处理的信号。。。