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 ファイルで「select」を grep します

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 に実装されています。

カーネルは FD を待機するために poll を使用し、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 のシステム コールもあります。違いは、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 に答える