从 BASH 获取 C 函数的标头

从 BASH 获取 C 函数的标头

我想要获取给定 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函数式语言并不是有史以来最聪明的事情,但对于许多函数来说,这个简单的过程仍然有效。

相关内容