内核源代码中select()函数的跟踪路径是什么?

时间:2013-03-19 02:16:27

标签: linux linux-kernel

我想知道为什么'man select'为nfds提供EINVAL> FD_SETSIZE。

但是我使用示例代码来测试它。 FD_SETSIZE = 1024,但select(4096,...)不返回EINVAL。

任何人都知道在哪里找到select()实现的源代码?

我使用此命令来发现类似的功能,但它与'select'

并不完全相同
$ find . -name '*.c' -exec grep -n 'select[(]int' {} /dev/null \;
./fs/select.c:396:int do_select(int n, fd_set_bits *fds, struct timespec *end_time)
./fs/select.c:518:int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
./fs/select.c:617:static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,

我在glibc source的syscalls.list文件中选择'select'

grep select ./sysdeps/unix/syscalls.list
select      -   select      Ci:iPPPP      __select  __libc_select select

我仍然不明白如何在glibc / linux内核代码中找到系统调用select()的源代码。

1 个答案:

答案 0 :(得分:1)

选择在/fs/select.c中实现,副本在fs / compat.c中实现compat_core_sys_select。

内核使用poll来等待FD,它用于模拟select。

glibc调用具有的select系统调用 入口点定义于: arch / x86 / syscalls / syscall_32.tbl:142 i386 _newselect sys_select compat_sys_select arch / x86 / syscalls / syscall_64.tbl:23常用select sys_select

fs / compat.c:asmlinkage long compat_sys_select(int n,compat_ulong_t __user * inp,compat_ulong_t __user * outp,compat_ulong_t __user * exp,         struct compat_timeval __user * tvp)

这是实际的实施。

还有一些旧的系统调用选择,不用于年龄。不同之处在于选择调用所需的参数数量。 它的来源是: arch / x86 / syscalls / syscall_32.tbl:82 i386 select sys_old_select compat_sys_old_select fs / compat.c:asmlinkage long compat_sys_old_select(struct compat_sel_arg_struct __user * arg)

您可能希望在/Documentation/filesystems/vfs.txt中找到有关vfs如何工作的更多信息