on_exit 和 CTRL+C

Dac*_*cav 2 c posix

我有一个小程序可以打开一个文件并对其进行一些操作。我将文件关闭订阅到程序终止如下:

static
void exit_handler (int ev, void *arg)
{
    fprintf(stderr, "bye %d\n", WEXITSTATUS(ev));
    fclose((FILE *)arg);
}

int main (int argc, char *argv[])
{
    FILE *out;

    ...

    out = fopen(argv[1], "wt");
    if (out == NULL) {
        perror("Opening output file");
        exit(EXIT_FAILURE);
    }
    on_exit(exit_handler, out);

    ...
}
Run Code Online (Sandbox Code Playgroud)

尝试执行此操作时,我注意到只有在程序正常终止时它才能正常工作。在CTRL+ C( SIGINT) 的情况下,exit_handler不执行回调。

这不是很奇怪吗?我应该将exit(EXIT_FAILURE)调用关联到信号处理程序SIGTERM吗?在这种情况下,最佳做法是什么?

Mik*_*wan 6

on_exit不会为SIGTERM信号调用。您需要为它添加一个处理程序signal。例如:

void signalHandler(void)
{
  ...
}

int main(void)
{
  signal(SIGTERM, signalHandler);
}
Run Code Online (Sandbox Code Playgroud)

还要注意,SIGKILL不能被设计捕获。

  • 这里的`signalHandler` 可以简单地`exit(0)`,它将调用`atexit` 处理程序。 (2认同)