【问题标题】:Linux/C How to properly end command line programLinux/C 如何正确结束命令行程序
【发布时间】:2013-12-17 00:34:54
【问题描述】:

我有一个在 Linux 命令行上运行的程序。它分配一些内存,打开一些文件描述符等。我想要一个好方法,让用户输入停止程序,同时仍然进行清理并且不中断一些文件读/写。这样做的正确方法是什么?到目前为止,我一直在使用 CTRL+C 来停止程序,但我觉得这并没有正确地进行清理,并且这不会让我的程序有机会写入日志文件以指示它正在关闭。 目前我正在这样做: - 将 STDIN 设置为非阻塞(这样程序就不会挂起等待输入)

while(loop_variable != 'q') {
loop_variable = getchar();
...
}

有什么建议吗?

【问题讨论】:

  • 捕获 SIGINT,当用户键入 ^C 时发送
  • 你的程序没有“感觉”什么样的清理?终止进程后,内核会为您清理所有内容。
  • 或者只是让用户输入 ^D 以便 getchar 将返回 EOF。
  • 同时捕获 SIGTERM 并在终止时正确清理。
  • 我想在程序结束时有一个日志条目,等等。我知道内核会清理所有内容,但我无法想象这是最好的方法。

标签: c linux command-line posix


【解决方案1】:

William Pursell 评论说你可以抓到 SIGINT。

当 SIGINT 被捕获时,您将如何实施清理。

首先,定义清理函数。在该功能中,您完成所有的房屋清洁工作。

void cleanup(int signum) {
    ... //all house cleaning steps like deleting files, closing file descriptors
}

在 main() 函数中,您可以调用 signal() 并传递函数 cleanup 的名称和关联的信号以进行 catch。您可以捕捉到适合您的用户操作的多种类型的信号。

signal(SIGINT, cleanup);
signal(SIGQUIT, cleanup);

【讨论】:

  • 这看起来正是我想要做的,谢谢!看起来我必须将任何文件描述符等设为全局才能从清理函数中访问它们,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2023-03-23
相关资源
最近更新 更多