Obtém o cabeçalho da função C do BASH

6

Eu quero obter o (s) cabeçalho (s) de que preciso para uma determinada função C - por exemplo, Quando eu quiser ver o que incluir quando quiser usar fork() , posso digitar man fork e ver que é #include <unistd.h> . No entanto, eu gostaria de fazer isso "automaticamente" (sem que eu olhasse para a tela), então eu poderia redirecionar a saída para o arquivo para inserção automática de cabeçalho. Como posso fazer isso?

    
por MatthewRock 14.01.2016 / 21:44

2 respostas

1

A menos que você queira escrever um analisador de página, acho que é melhor apostar nele para criar um arquivo de texto e corrigi-lo manualmente. Comece com algo como:

$ 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

As primeiras 10 linhas que obtenho mostram uma taxa de sucesso de 80%; duas páginas não mencionam um arquivo de inclusão:

         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>

Então, para ser realmente preguiçoso, use uma pequena função para pesquisar em seu arquivo, algo como

$ inc() { awk -F\t -e "/^ *$1/ "'{print $2}' /tmp/inc; }
$ inc fork
   #include <unistd.h>

Tenha em atenção que algumas páginas de manual mencionam mais do que um ficheiro de cabeçalho, dependendo das funcionalidades ou da função utilizada nessa página. Por exemplo, consulte soquete (2).

    
por 17.02.2016 / 02:47
0

Eu não conheço nenhuma ferramenta que faça esse trabalho automaticamente, provavelmente é necessário  faça isso manualmente. Primeiro, vamos encontrar o caminho de onde gcc está incluindo arquivos:

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

Agora, pode-se usar grep a definição da função dentro desses cabeçalhos.

Em C ou C ++ cada função recebe e retorna algum argumento (pelo menos void), também parece que muitos arquivos de cabeçalho linux são escritos de uma maneira padrão, então para remover o lixo, pode-se rodear fork com espaços e adicionar parêntesis de abertura no final:

$ 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

(usei aqui o mecanismo de substituição disponível no bash e em algum outro shell)

Obviamente, pode-se argumentar que grep ing linguagem funcional não é a coisa mais brilhante de sempre, mas ainda assim, para muitas funções, este procedimento simples funciona.

    
por 19.01.2016 / 01:27

Tags