주어진 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
분명히, 함수형 언어가 지금까지 가장 똑똑한 것이 아니라고 주장할 수도 있지만 , 많은 함수의 경우 이 간단한 프로세스가 여전히 작동합니다.