【问题标题】:How can I immediately close a program in C?如何立即关闭 C 中的程序?
【发布时间】:2011-11-01 22:13:51
【问题描述】:

我正在编写 C 代码,其中我正在分析一些数据。我已将程序设置为仅处理 100 个数据输入。当它有超过 100 个输入时,它给出了分段错误。我想创建一种方法,以便当输入数量超过 100 时,将警告用户并且程序将终止。我知道如何通过简单的return 0 从主函数中执行此操作,但是我在主函数之外调用了多个函数,而且很难做到这一点,即使此函数中的return 0 也会使其保持循环。

有没有什么方法可以直接终止整个程序而不进入主程序?

【问题讨论】:

  • 您可以使用<stdlib.h> 中的exit(int),但我想您可能想了解一下为什么您的程序不能处理超过100 个数据点。除非这是设计使然,或者您不希望他们这样做。
  • birryree 是正确的。虽然可能突然从程序中的任何地方退出,但这是非常糟糕的做法(尤其是如果您没有清理指针和其他对象中的内存)。您最好优雅地处理他们有超过 100 个数据输入的情况,并在全部清理后退出并显示错误代码。
  • 那个exit标签现在看起来很有伏笔……
  • @TheCapn 你知道退出程序后,所有内存(堆和堆栈)都会自动清理吗?自 Windows 98 以来,我还没有看到真正持久的内存泄漏。
  • 如果您的程序失败,您不应从 main 返回 0。如果你返回零,你就是在告诉操作系统你成功了。失败时最好返回EXIT_FAILURE,程序成功时才返回EXIT_SUCCESS(0)。

标签: c exit


【解决方案1】:

标准函数exit 就是你要找的:

正常终止进程,为终止进程执行定期清理。

首先,通过调用 atexit 注册的所有函数都按其注册的相反顺序执行。然后,关闭所有流并删除临时文件,最后将控制权返回给宿主环境。

状态参数返回到宿主环境。

如果你修复了段错误会更好。

【讨论】:

  • 考虑exit()abort()的区别——atexit()的处理。
【解决方案2】:

你需要包含标准库,然后你可以在任何你想要的地方调用 exit:

#include <stdlib.h>
...
exit(status);

其中 status 是一个表示退出代码的整数。 关注状态:约定 0 表示成功,其他值表示错误状态。

【讨论】:

  • 标准提供了常量 EXIT_SUCCESS 和 EXIT_FAILURE。有些机器将任何偶数视为成功,而将奇数视为失败。
【解决方案3】:

您也可以fprintf(stderr, ....),然后拨打abort();如果您想稍后调试您的错误,这会很有帮助。

但我认为您应该重新编码您的程序,以便仅由可用资源给出大小限制:因此,如果您在一台 更大 计算机上运行您的程序(无论这意味着什么),它可以处理超过100 个输入。

【讨论】:

    【解决方案4】:

    更好的做法可能是使用信号处理程序捕获分段错误,并让信号处理程序引发 SIGSTOP 信号。

    这样您的程序会停止,但会保留在内存中。然后,您可以使用调试器附加到它,并看到程序在 SEGFAULT 发生时冻结在原地。

    这对于发现您没有在开发 IDE 中运行的长时间运行的程序中的问题很有用。

    【讨论】:

    • 这是正确的答案。不仅建议解决实际问题,还提供有关如何解决问题的建设性建议。当然这是一个 POSIX 唯一的答案,但仍然......
    • @JerryJeremiah 这是我在某些系统类型中使用过的一个方便的技巧,还有一个额外的好处是,如果可以确定为什么首先引发了段错误并且修复只是简单地编辑一个可变值(并非总是可能),之后可以恢复该过程!我还用它来做其他事情,比如在 sigstop 被提升之前向其他进程(有时在其他机器上)发送“挂起”消息,以使整个基础设施陷入停顿。最近我也是 signalfd 的粉丝——Linux 现在有一个非常好的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 2019-01-27
    相关资源
    最近更新 更多