kri*_*itx 6 linux system-calls
我一直在尝试了解系统调用,并想了解 set_tid_address 的工作原理。从我读到的基本上来说,它返回所执行的程序或进程的pid。
我已经用 ls 对此进行了测试,但是对于某些命令(例如 uptime、top 等),我没有看到使用 set_tid_address 。这是为什么?
系统clone()调用可以采用一个CLONE_CHILD_CLEARTID标志,该标志child_tidptr(另一个clone()参数)的值将被清除,并且当子线程退出时,关联的 futex 会发出唤醒信号。这是用来实现的pthread_join()(父线程在futex上等待)。
set_tid_address()允许pthread_join()在初始线程上。更多信息请参见以下 LKML 线程:
[补丁] 线程修复,tid-2.5.47-A3
[补丁] user-vm-unlock-2.5.31-A2
至于为什么有些程序调用set_tid_address()而另一些程序不调用,答案很简单。(直接或间接)链接到 libpthread 调用的程序set_tid_address。ls链接到librt, 链接到libpthread,因此它运行 NPTL 的初始化。