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++모든 함수는 일부 인수(적어도 무효)를 취하고 반환하며 많은 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분명히, 함수형 언어가 지금까지 가장 똑똑한 것이 아니라고 주장할 수도 있지만 , 많은 함수의 경우 이 간단한 프로세스가 여전히 작동합니다.

관련 정보