c - 如何在linux中找到一个函数的实现?

标签 c linux vim operating-system

有时候,我想知道一个c函数的实现。我的编辑器是 vim。我尝试了 ctags 和 cscope,还有 man。

man 2|3 只告诉我如何使用一个函数。

ctags和cscope都只能找到部分函数的实现。

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

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

最佳答案

select(2)system call (但我建议改用 poll(2) - google C10K problem 以了解为什么我更喜欢 poll 而不是 select)。所以它真的是在linux kernel内部实现的. libc 包含一个小 stub 函数(将 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 是一个方便的实用程序,用于查找某个进程(或正在运行的程序)完成了哪些系统调用。

关于c - 如何在linux中找到一个函数的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384606/

相关文章:

java - 从 LKM/kernel-space 启动 Android Activity

c - C 标准库头文件的 Eclipse CDT 出现 "Unresolved inclusion"错误

linux - 通过从原始 svn 仓库中获取所有 svn 部分来克隆一个 git-svn 仓库

Vim 在多行上拉取文本对象的方法

vim - 使用 Vim 删除文件中的所有空格并用逗号替换它们

c++ - 如何在 Linux 上执行适用于 x86、arm、GCC 和 icc 的原子操作?

c - 在可变参数函数的包装器中中继可选参数

c - malloc() 分配的数据不为零

linux - 终止使用 system() 启动的进程

mapping - Vim <CR> 映射不起作用?