【问题标题】:How to implement analogue of exit() functions? -std=c99如何实现 exit() 函数的模拟? -std=c99
【发布时间】:2012-11-30 19:52:05
【问题描述】:

我正在写一个大学项目。用标准 C99 编写。要求之一是缺少 exit(); 功能。是否可以实现类似的功能? 我试图制作一个调用 main 并带有减号 argc 的函数来检测退出。这是一个愚蠢的尝试,因为第一个 main 还在继续。

刚才项目描述中指定exit()使用exit会降低分数。我理解是要求我通过指针来代码运行,并在函数的返回值中返回错误.我对实践更感兴趣。只为我自己。

【问题讨论】:

  • 为什么是 C++ 标签?这是一个 C99 问题...
  • "用标准 C99 编写。要求之一是缺少 exit();" - 那么它就不是标准的 C99。
  • 对不起,我不明白这个要求。你是说你的环境不包括exit()?或者你是说你被限制永远不会调用它?
  • man exit,你要实现哪个版本?
  • 如果你不能使用exit(),总有abort()。 (不是很严重。)

标签: c exit c99 termination


【解决方案1】:

认为你误解了这个要求:他们可能说的是do not use exit()。这并不意味着你应该实现你自己的exit(),恰恰相反:它们可能意味着你的程序的唯一退出点应该是你的主函数的结尾(或主函数中的返回语句函数),这被认为是良好的编程风格。

【讨论】:

  • 只是项目的描述指定使用exit()退出会降低分数。我知道它要求我通过指针运行代码并在返回值中返回错误的功能。我对实践更感兴趣。只为我自己。
  • @MarkBirger:正是这个答案所说的。您应该设计您的程序,使错误(通过返回语句)一直传播回主函数,而不是调用exit
【解决方案2】:

exit() 是一个系统级工具,如果不知道操作系统如何实现它(Linux?Windows?嵌入式系统?),您就无法自行实现。正如 Daniel Fischer 所提到的,您可以调用 abort(),它的作用基本上与 exit 所做的相同并退出程序。

还有其他“hacks”可以让您的程序在不显式调用 exit() 的情况下中止,但这些只是 hacks,不应在生产代码中使用。

  1. 使用 C 链接创建一个 C++ 函数并引发异常

    extern "C" MyExit() { throw std::exception(); }

  2. 使用 SIGKILL 调用 signal()

  3. 致电abort()

  4. 编写一些汇编代码来展开调用堆栈,直到它到达调用main 的函数,并将返回值插入正确的返回寄存器并从那里开始。我不认为你可以在纯 C 中做到这一点,因为 ABI 不能直接访问。但至少这将是唯一不涉及操作系统(仅 ABI)的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多