如何在linux中找到函数的实现?

时间:2013-05-05 12:38:03

标签: c linux vim operating-system

有时,我想知道c函数的实现。我的编辑是vim。我试过ctags和cscope,还有man。

man 2 | 3只告诉我如何使用一个功能。

ctags和cscope都可以找到一些函数的实现。

他们都找不到一些功能。特别是一些系统功能(调用)。

如果一个函数可以通过包含一些头文件来使用,有什么方法可以轻松找到一个函数的实现,

2 个答案:

答案 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是一个方便的实用程序,用于查找某些进程(或正在运行的程序)完成的系统调用。