【问题标题】:Why is it exit(42)? [duplicate]为什么退出(42)? [复制]
【发布时间】:2016-09-07 09:39:53
【问题描述】:

为什么我们在退出进程时使用 42 作为 exit 的参数?我想知道它是一些宏值(比如 1 是 EXIT_FAILURE 宏的值)还是有更深层次的含义?

if(pid == 0) {
    printf("something\n");
    exit(42);
}

很明显,我使用 exit(1) 还是 exit(42) 并不重要,但为什么只使用 42?

【问题讨论】:

  • 因为127被拍了?
  • 42 显然是一个命名值的相反——它是一个神奇的值,只有代码的作者知道它为什么存在。但它不是可移植的,唯一可移植的退出值是 0、EXIT_SUCCESSEXIT_FAILURE
  • 要更明确地了解其他人所说的话:不要想太多。它只是一个流行文化参考,对 C 语言没有任何特殊意义。

标签: c


【解决方案1】:

除了 0 以外的任何数字都可以。但是 42 是 Answer to the Ultimate Question of Life, the Universe, and Everything

在 IT 人员中很受欢迎...

但为什么道格拉斯·亚当斯选择了 42?

我坐在办公桌前,凝视着花园,心想“42 就可以了”。一世 打出来的。故事结束

【讨论】:

  • 哦,伙计,我知道,但这太有趣了,不可能是真的 xD
【解决方案2】:

这样的魔法值可用于指示父进程的确切退出原因。您可能会像某种简约的 IPC 一样威胁它。当然,两个进程必须就实际值及其含义达成一致,并且不使用特殊的保留退出代码。

【讨论】:

  • 如果可能,应该首选来自sysexits.h 的值。这是相当标准的。
【解决方案3】:

很明显,我使用 exit(1) 还是 exit(42) 并不重要

其实很重要。

启动退出进程的进程可以使用退出代码来了解它是如何完成的以及失败的原因。

启动您的程序的进程可以在您的程序完成后立即检查环境变量$? 的值,以了解它是否成功或失败的原因(如果没有成功)。

假设您的程序从远程站点下载文件并将其存储在本地目录中。它希望使用现有的本地目录,如果它不存在,它不会尝试创建它。例如,当由于远程站点返回404 Not Found而无法下载远程文件时,它可以使用代码37退出,当由于网络关闭(或发生超时)而无法下载文件时,它可以使用代码62退出当本地目录不存在时编码41

例如,调用程序的bash 脚本可以在程序完成后立即检查环境变量$? 的值。如果其值为37(未找到远程文件),则不得尝试重试,因为错误是永久性的。在退出代码62(网络问题)上,它可以等待几秒钟然后重试(错误情况是暂时的,它可能会在一段时间后消失)。在退出代码41(未找到本地目录)上,它可以创建本地目录,然后再次启动您的程序(不满足前提条件)。

【讨论】:

  • 37、62 和 41 是您刚刚输入的随机数,还是某种约定?
  • 1127 之间的随机数。 0 是成功的退出代码,大于 127 的值在所有 Unix 系统上的解释方式不同。
  • 我明白了。您在答案中引用 37/62/41 的方式看起来好像是某类程序的标准。 (就像--gnu-options 是 GNU 程序的标准,但不是 Windows 或 Java 程序等的标准)
猜你喜欢
  • 2021-03-10
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多