web-dev-qa-db-ja.com

BASHからC関数のヘッダーを取得します

特定のC関数に必要なヘッダーを取得したい-例: fork()を使用するときに何を含めるかを確認したい場合は、man forkと入力して、#include <unistd.h>であることを確認できます。ただし、(画面を見ずに)「自動的に」実行したいので、出力をファイルにリダイレクトして、ヘッダーを自動挿入することができます。これどうやってするの?

6
MatthewRock

マンページパーサーを作成する場合を除いて、テキストファイルを作成して手動で修正するのが最善の策だと思います。次のようなものから始めます。

$ 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>

機能やそのページで使用されている機能に応じて、一部のマニュアルページには複数のヘッダーファイルが記載されていることに注意してください。例については、socket(2)を参照してください。

1
James K. Lowden

この仕事を自動的に行うツールはわかりません。おそらく手動で行う必要があります。まず、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ヘッダーファイルは1つの標準的な方法で記述されているため、ガベージを削除するには、forkをスペースで囲み、最後に開き括弧を追加します。

$ 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やその他のシェルで利用可能な置換メカニズムを使用しました)

明らかに、greping関数型言語はこれまでで最も優れたものではないと主張するかもしれませんが、それでも、多くの関数では、この単純な手順が機能します。

0
jimmij