谁可以解释以下代码的含义?
如果未定义__KERNEL__
,请定义以下宏。
何时何地定义__KERNEL__
?
/* only for userspace compatibility */
#ifndef __KERNEL__
/* IP6 Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP6_PRE_ROUTING 0
/* If the packet is destined for this box. */
#define NF_IP6_LOCAL_IN 1
/* If the packet is destined for another interface. */
#define NF_IP6_FORWARD 2
/* Packets coming from a local process. */
#define NF_IP6_LOCAL_OUT 3
/* Packets about to hit the wire. */
#define NF_IP6_POST_ROUTING 4
#define NF_IP6_NUMHOOKS 5
#endif /* ! __KERNEL__ */
答案 0 :(得分:26)
编译内核时,在命令行中定义了__KERNEL__
。
用户空间程序需要访问内核头文件,但内核头文件中的某些信息仅适用于内核。在#ifdef __KERNEL__/#endif
块中包含一些语句可确保用户空间程序不会看到这些语句。
答案 1 :(得分:7)
定义
__KERNEL__
宏是因为有程序(比如库)而不是包含内核代码,并且有许多事情你不希望它们包括在内。因此,大多数模块都希望启用__KERNEL__
宏。
答案 2 :(得分:1)
在用户空间iptables
应用程序(可能还有glibc
和其他应用程序)中使用相同的代码,因此可以保护非内核代码。