最近我正在研究Linux内核编程,我发现了一些奇怪的东西。 clone_flags
中do_fork()
的{{1}}列在<uapi/linux/sched.h>
中,但我发现它们在语义方面有不同的命名约定。
clone_flags
大致可分为以下几类:
CLONE_VM
,CLONE_FS
,CLONE_FILES
,...:CLONE_ABC
表示父进程和子进程共享资源ABC CLONE_NEWNS
,CLONE_NEWIPC
,CLONE_NEWUSER
,...:CLONE_NEWABC
含义为子流程创建新的 ABC CLONE_SETTLS
:这是为子进程创建新 TLS的唯一CLONE_IO
:这是唯一一个克隆子进程的IO上下文我认为这些标志在命名约定方面有很大不同。为什么我们不能将NEW
放在第二类中,只是将它们合并到第一类中。 CLONE_IO
与第一类完全相反。
这种奇怪的(我认为)情况有历史原因吗?或者是否有任何关于命名约定如何工作的解释?
答案 0 :(得分:0)
为什么我们不能在第二类中删除NEW并将它们合并到第一类。
因为你可以乍一看告诉我们做了什么。如果flag包含NEW
- 我们正在创建资源。
如果我们正在使用TID
- 标记包含TID
(CLONE_PARENT_SETTID
,CLONE_CHILD_CLEARTID
,CLONE_CHILD_SETTID
)。
我发现这个命名惯例并不奇怪。