我想要获取给定 C 函数所需的标头 - 例如,当我想查看要使用的内容时fork()
,我可以键入man fork
并看到它是#include <unistd.h>
.但是,我想“自动”执行此操作(无需看屏幕),因此我可以将输出重定向到文件以自动插入标头。我怎样才能做到这一点?
答案1
除非您想编写一个联机帮助页解析器,否则我认为最好的选择是构建一个文本文件并手动修复它。从这样的事情开始:
$ ls /usr/share/man/man2 | sed 's/\.2.*//' \
| while read F
do
I=$(man $F | grep '#include'| head -1 | sed 's/>.*$/>/')
printf '%15s:\t%s\n' $F "$I"
done
我得到的前 10 行显示成功率为 80%;有两页没有提到包含文件:
accept: #include <sys/types.h>
accept4: #include <sys/types.h>
access: #include <unistd.h>
acct: #include <unistd.h>
add_key: #include <keyutils.h>
adjtimex: #include <sys/timex.h>
afs_syscall:
alarm: #include <unistd.h>
alloc_hugepages:
arch_prctl: #include <asm/prctl.h>
然后,为了变得非常懒,使用一个小函数来搜索你的文件,比如
$ inc() { awk -F\\t -e "/^ *$1/ "'{print $2}' /tmp/inc; }
$ inc fork
#include <unistd.h>
请注意,某些手册页提到了多个头文件,具体取决于使用该页面上的功能或函数。有关示例,请参见套接字(2)。
答案2
我不知道有什么工具可以自动完成这项工作,可能需要手动完成。首先让我们找到gcc
包含文件的路径:
$ gcc -v
(...)
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.9.3/include
/usr/lib/gcc/i686-pc-linux-gnu/4.9.3/include-fixed
/usr/include
End of search list.
现在我们可以grep
在这些头文件中定义函数了。
在C或者C++每个函数都接受并返回一些参数(至少是void),而且似乎许多linux头文件都是以一种标准方式编写的,因此要删除可以围绕的垃圾叉带有空格并在末尾添加左括号:
$ headers=(/usr/include /usr/lib/gcc/i686-pc-linux-gnu/4.9.3/include /usr/lib/gcc/i686-pc-linux-gnu/4.9.3/include-fixed)
$ grep -l ' fork (' ${headers[@]/%//*.h}
/usr/include/unistd.h
(我在这里使用了 bash 和其他一些 shell 中提供的替换机制)
显然,有人可能会说grep
函数式语言并不是有史以来最聪明的事情,但对于许多函数来说,这个简单的过程仍然有效。