【问题标题】:int main() in C language return(s) an int but shell accepts only unsigned char [duplicate]C语言中的 int main() 返回一个 int 但 shell 只接受 unsigned char [重复]
【发布时间】:2017-09-05 21:53:33
【问题描述】:

我了解到在 C 语言中 main() 通常返回一个 int。 到目前为止,我已经对其进行了测试。例如,int 是 4 个字节, 但是 shell 只接受从 main() 返回的无符号字符。 在我的系统(Linux、FreeBSD 和 NetBSD)上,shell(bash 和 tcsh)很可能只接受只接受最右边的一个字节。例如,如果 main() 返回 0xabcdef0a,在 shell 中编译并运行后,发出命令 echo $?,结果在所有系统中始终为 10 (0x0a)。所以我的问题是,为什么 main() 不返回 unsigned char 而不是 int?

【问题讨论】:

  • 历史 — 当约定建立时,C 中没有任何 unsigned char。此外,捕获退出状态的进程会获得一个 16 位的值,其中 8 位是退出状态,其中 8 位是与信号相关的信息(如果子进程没有死于信号,则为 0) .而在这个建立的年代,int 通常是 16 位,所以int 是合适的。
  • @JonathanLeffler 感谢您的澄清。这让我很清楚。 :-)
  • 为了使这个工作可以解决什么问题?
  • @Nguaial, ...“工作”?一切都已经按照 POSIX 的定义准确运行了。
  • 来自 POSIX 规范,强调添加:“当使用特殊参数 '?' 报告退出状态时,shell 应报告可用的全部八位退出状态” .因此,一个 shell 不应该有超过 8 位的内容,用 $? 表示。

标签: c bash tcsh


【解决方案1】:

将评论转化为答案。

原因有一个共同点:历史。在 1970 年代初建立约定时,C 中还没有 unsigned char 类型。此外,捕获退出状态的进程会获得一个 16 位的值,其中 8 位是退出状态,其中 8 位是与信号相关的信息(如果子进程没有死于信号,则为 0) .而在这个建立的年代,int 通常是 16 位,所以使用int 是合适的。

你也可以看看ExitCodes greater than 255 — possible?

【讨论】:

  • 而旧的 MS-DOS errorlevel 在批处理文件中用于对程序的退出值执行操作,最大值为 255(8 位)。
猜你喜欢
  • 2011-07-08
  • 2011-06-18
  • 2014-10-09
  • 2022-11-28
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多