0

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

但我使用示例代码来测试它。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 源的 syscalls.list 文件中 grep 'select'

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

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

4

1 回答 1

1

Select 在 /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 common 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)

这是实际的实现。

还有一些旧的 select 系统调用,已经很久没有使用了。不同之处在于选择调用需要的参数数量。它的来源在: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 工作原理的更多信息

于 2013-03-19T12:47:22.783 回答