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%の成功率を示しました。インクルードファイルへの言及がない2つのページがありました。

         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++すべての関数はいくつかの引数(少なくとも無効)を取り、返し、多くの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と他のシェルで提供される代替メカニズムを使用しています)

grep明らかに、関数型言語がこれまで最もスマートではなかったと主張するかもしれませんが、多くの関数の場合、この単純なプロセスはまだ機能します。

関連情報