【发布时间】:2018-12-23 07:33:53
【问题描述】:
我查看了 MINIX 3 的标头,在 include/signal.h 中有一些看似不寻常的定义:
/* Macros used as function pointers */
#define SIG_ERR ((sig_handler_t) -1) /* error return */
#define SIG_DFL ((sig_handler_t) 0) /* default signal handling */
#define SIG_IGN ((sig_handler_t) 1) /* ignore signal */
#define SIG_HOLD ((sig_handler_t) 2) /* block signal */
#define SIG_CATCH ((sig_handler_t) 3) /* catch signal */
首先,SIG_ERR 是如何有效的?其次(对于我的主要问题),源代码中还有其他指针映射到其中一些地址(例如NULL)。如果取消引用这些指针之一会发生什么?这些地址中的数据是否有效?
【问题讨论】:
-
与尝试取消引用 NULL 指针一样。
-
@purec:
0的整数值不一定是空指针。该代码显然超出了标准,仅用于将int常量转换为指针。只能用平台细节来解释。 -
@Olaf,代码与标准无关......它是 MINIX 实现的信号处理特殊值的实现。用于指示默认行为、忽略信号或系统错误的特殊值(信号返回指向已安装的旧信号处理程序的指针或
SIG_ERR(-1转换为(sig_handler_t),与系统调用一样) -
@LuisColorado:请您再次仔细阅读我的评论好吗?我准确地写了它的实现特定的。尽管如此,我还是希望 caode 在 64 位平台上引起问题(以防 Minix 被移植到一个平台上)。尽管如此,它仍然存在问题。最好使用
uintptr_t或intptr_t作为基本类型。但是,Minix 本身就是一种遗产,比现代 C 语言要古老得多。 -
@Olaf,抱歉您误解了我...您评论“代码显然是...”,我说代码无事可做。我同意你的观点,除了在我的陈述中更具侵略性......这就是我试图表明的,而不是你和我之间的差异。