【问题标题】:Are there any alternatives to err() that do not terminate/exit program?是否有任何不终止/退出程序的 err() 替代方法?
【发布时间】:2021-04-12 16:11:40
【问题描述】:

中的 err() 系列函数是否有替代方法,可以显示程序名称、分号、空格和错误消息...而不退出程序?

伪代码

我想要

print "<program name>: <error message>"

而不是

print "<program name>: <error message>"
exit program
return <status>

编辑:我不能使用 argv[0](作为程序名称)自己写出消息,因为我正在编写一个库

【问题讨论】:

  • 另一种方法是自己编写。这不是很困难。
  • 问题在于获取程序本身的名称。我不能使用 argv[0],因为我正在使用 C 库。
  • 您可以查看err 源代码以获取见解。它是开源的。或者您可以为您的库添加一个初始化函数,该函数将作为参数传递argv[0]
  • 假设您知道哪个程序产生了错误,您可能会发现__FILE____LINE____FUNCTION__(如果支持)更有用,可以通过调用函数传递认为这是违法的。
  • @WeatherVane 我不能假设这一点,因为编译我的代码的其他人可能会以不同的方式命名程序。我不知道在编译时间之前派生调用名称的方法,但是 err() 以某种方式设法做到了。我觉得这是依赖于编译器的,因为 不是标准库的一部分...

标签: c error-handling exit


【解决方案1】:

program_invocation_name 与 Erdal Küçük 提到的一样,可以用于获取程序的名称。从中,我们可以打印完整的错误消息,包括程序名称。

该变量是 glibc 的一部分,可以使用以下方法检索:

extern char *program_invocation_name;

因为它不是 C 标准库的一部分,所以不应该期望使用这个变量的程序是可移植的。

【讨论】:

  • program_invocation_name 是一个 glibc 功能。
【解决方案2】:

man error

errorerr 相同,但如果status == 0 则返回,否则退出。

符合

  • 这些函数和变量是 GNU 扩展,不应在旨在可移植的程序中使用。

【讨论】:

  • 在退出前调用 error() 后声明“:不允许操作”。虽然我还没有采用这种方法,但我通过与我相同的手册页发现了 program_invocation_name。通过使用extern,我能够成功打印带有程序名称的错误消息!
  • 哇,我现在已经测试过了,这就是我得到的结果:中断的系统调用。我必须承认,我以前从未使用过error,我需要对此进行一些研究。
猜你喜欢
  • 2018-02-23
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多