我想在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 才能查看为没有手动编码版本的系统调用生成的源文件。