Onde encontrar o arquivo de origem da função pause (void) e sigsuspend (set)

6

Eu quero encontrar o arquivo de origem de pausa e sigsuspend no pacote glibc-2.14.1. Eu grep o pacote e encontrar o arquivo sysdeps / posix / pause.c tem uma definição de função pause, o código é

int 
__libc_pause (void) 
{ 
   sigset_t set; 

   __sigemptyset (&set); 
   __sigprocmask (SIG_BLOCK, NULL, &set); 

   /* pause is a cancellation point, but so is sigsuspend. 
       So no need for anything special here.  */ 

   return __sigsuspend (&set); 
 } 
 weak_alias (__libc_pause, pause) 

Eu também faço o grep do pacote para a definição da função sigsuspend e vários arquivos têm a definição, como sysdeps / posix / sigsuspend.c e sysdeps / unix / sysv / linux / sigsuspend.c.

A definição de sigsuspend em sysdeps / posix / sigsuspend.c é

int 
__sigsuspend (set) 
    const sigset_t *set; 
{ 
   sigset_t oset; 
  int save; 

  if (set == NULL) 
    { 
     __set_errno (EINVAL); 
      return -1; 
   } 

  if (sigprocmask (SIG_SETMASK, set, &oset) < 0) 
     return -1; 

   (void) pause(); 
   save = errno; 

  if (sigprocmask (SIG_SETMASK, &oset, (sigset_t *) NULL) < 0) 
    return -1; 

   __set_errno (save); 
  return -1; 
 } 
libc_hidden_def (__sigsuspend) 
weak_alias (__sigsuspend, sigsuspend) 

Eu encontrei um problema que pausa em sysdeps / posix / pause.c chamada função sigsuspend e sigsuspend em sysdeps / posix / sigsuspend.c pausar a função de chamada. Parece ser um ciclo. Então eu acho que não encontro os arquivos de pausa adequados e sigsuspend. Qualquer pessoa pode me dizer onde estão os arquivos de origem dessas funções. Agradecemos antecipadamente.

    
por Jerome 24.02.2012 / 01:23

1 resposta

4

Existem várias definições de pause () e sigsuspend () na árvore glibc. As definições realmente usadas dependem de qual sistema e arquitetura foram construídos para a glibc. Em sistemas Unix mais antigos, em que pause () é uma chamada de sistema, sigsuspend () é implementado chamando pause (). Em sistemas onde o sigsuspend () é uma chamada do sistema, o pause () é implementado chamando sigsuspend (). As chamadas do sistema em si são implementadas na linguagem assembly, seja acionando uma interrupção ou executando uma instrução especial para fazer com que o kernel assuma o controle. O processo de compilação da glibc garante que a combinação certa de arquivos fonte da linguagem assembly e C seja usada para construir a biblioteca final.

As chamadas de sistema que não possuem seus próprios arquivos de origem têm definições geradas pelo processo de construção usando um script de shell chamado make-syscalls.sh, cujas ações são controladas por syscalls.list. O código para a chamada do sistema é gerado por este script. A parte de geração de código do script é quase tão impenetrável quanto o código de shell, e diz quase de imediato: "A melhor maneira de entender o que está acontecendo aqui é examinar a saída em BUILDDIR / sysd-syscalls." Portanto, você terá que criar o glibc para ver os arquivos de origem gerados para as chamadas do sistema que não possuem versões codificadas manualmente.

    
por 24.02.2012 / 08:22

Tags