有时,我想知道 ac 函数的实现。我的编辑器是 vim。我尝试过 ctags 和 cscope 以及 man。
man 2|3 只告诉我如何使用一个函数。
ctags 和 cscope 都只能找到一些函数的实现。
他们都找不到一些功能。特别是一些系统功能(调用)。
如果一个函数可以通过包含一些头文件来使用,有什么方法可以轻松找到一个函数的实现,
有时,我想知道 ac 函数的实现。我的编辑器是 vim。我尝试过 ctags 和 cscope 以及 man。
man 2|3 只告诉我如何使用一个函数。
ctags 和 cscope 都只能找到一些函数的实现。
他们都找不到一些功能。特别是一些系统功能(调用)。
如果一个函数可以通过包含一些头文件来使用,有什么方法可以轻松找到一个函数的实现,
select(2)是一个系统调用(但我建议使用poll(2)代替 - 谷歌C10K problem
了解我为什么更喜欢poll
)select
。所以它确实是在linux 内核中实现的。它libc
包含一个小的存根函数(将 C 参数约定转换为系统调用约定,然后使用例如一些SYSENTER
机器指令执行真正的系统调用)。您可以查看MUSL Libc的源代码(我推荐 MUSL libc,因为它的源代码更容易阅读)或真正的Gnu libc以查看该包装函数。
FD_SET
只是一个宏,定义在/usr/include/x86_64-linux-gnu/sys/select.h
并且真的在/usr/include/bits/select.h
但是您尝试了解Linux的软件功能是如何实现的是非常正确的:利用它是免费软件。
实际上,系统调用层定义良好且相当稳定(请参阅syscalls(2)手册页,并阅读Advanced Linux Programming了解更多信息。同时查看Posix标准)。研究使用它们的高级库的源代码(例如 Qt、Gtk、...)会更有趣。
从应用程序的角度来看,系统调用是基本的“原子”操作。strace
是一个方便的实用程序,用于查找哪些系统调用是由某个进程(或正在运行的程序)完成的。