哪里可以找到函数pause(void)和sigsuspend(set)的源文件

哪里可以找到函数pause(void)和sigsuspend(set)的源文件

我想在glibc-2.14.1包中找到pause和sigsuspend的源文件。我 grep 包并找到文件 sysdeps/posix/pause.c 有函数暂停的定义,代码是

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) 

我还 grep 了 sigsuspend 函数定义的包,几个文件都有定义,例如 sysdeps/posix/sigsuspend.c 和 sysdeps/unix/sysv/linux/sigsuspend.c。

sysdeps/posix/sigsuspend.c 中 sigsuspend 的定义是

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) 

我发现了一个问题,在sysdeps/posix/pause.c调用函数sigsuspend中暂停,在sysdeps/posix/sigsuspend.c调用函数pause中暂停sigsuspend。似乎是一个循环。所以我认为我没有找到暂停和sigsuspend的正确源文件。谁能告诉我这些函数的源文件在哪里?提前致谢。

答案1

glibc树中有多个pause()和sigsuspend()的定义。实际使用的定义取决于 glibc 是为哪个系统和架构构建的。在较旧的 Unix 系统上,pause() 是一个系统调用,sigsuspend() 是通过调用pause() 来实现的。在 sigsuspend() 是系统调用的系统上,pause() 是通过调用 sigsuspend() 来实现的。系统调用本身是用汇编语言实现的,要么触发中断,要么执行特殊指令让内核接管。 glibc 构建过程确保使用正确的 C 语言和汇编语言源文件组合来构建最终的库。

没有自己的源文件的系统调用具有由构建过程使用名为 make-syscalls.sh 的 shell 脚本生成的定义,其操作由 syscalls.list 驱动。系统调用的代码是由该脚本生成的。该脚本的代码生成部分与 shell 代码一样难以理解,并且在一开始就说“了解这里发生的情况的最佳方法是检查 BUILDDIR/sysd-syscalls 中的输出。”因此,您必须构建 glibc 才能查看为没有手动编码版本的系统调用生成的源文件。

相关内容