我想知道为什么'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()的源代码。
答案 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如何工作的更多信息