有时,我想知道c函数的实现。我的编辑是vim。我试过ctags和cscope,还有man。
man 2 | 3只告诉我如何使用一个功能。
ctags和cscope都可以找到一些函数的实现。
他们都找不到一些功能。特别是一些系统功能(调用)。
如果一个函数可以通过包含一些头文件来使用,有什么方法可以轻松找到一个函数的实现,
答案 0 :(得分:2)
您不会动用提供功能实现的模块的来源。
对于Linux,大多数使用的模块都是开源的,因此可以访问源代码。
从何处获取来源取决于库和/或使用的分发。这包括内核。
有些发行版可能包含所有来源。 Gentoo就是其中之一。
对于基于Debian的发行版,使用apt-get
工具轻松获取软件包的来源:
$ apt-get source <package-name>
其他发行版可能会使用其他方式提供资源。或许SO专家可能会评论/回答这些问题。
答案 1 :(得分:2)
select(2)是system call(但我建议使用poll(2) - google for C10K problem
来理解为什么我更喜欢poll
而不是select
)。所以它真的在linux kernel内实现。 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的软件功能是非常正确的:利用free software。
实际上,系统调用层定义良好且非常稳定(请参阅syscalls(2)手册页,并阅读Advanced Linux Programming了解更多信息。另请参阅Posix标准。使用它们研究更高级库的源代码更有意思(例如Qt,Gtk,...)。
从应用程序的角度来看,系统调用是基本的“原子”操作。 strace
是一个方便的实用程序,用于查找某些进程(或正在运行的程序)完成的系统调用。