gpt4 book ai didi

linux - linux套接字的文件描述符总是按递增顺序排列吗

转载 作者:IT王子 更新时间:2023-10-29 00:56:06 25 4
gpt4 key购买 nike

我在 C/linux 中有一个套接字服务器。每次我创建一个新套接字时,它都会被分配一个文件描述符。我想将这些 FD 用作每个客户的唯一 ID。如果保证它们总是以递增的顺序分配(我正在运行的 Ubuntu 就是这种情况),那么我可以将它们用作数组索引。

所以问题是:从 linux 套接字分配的文件描述符是否保证始终按递增顺序排列?

最佳答案

让我们看看它在内部是如何工作的(我使用的是内核 4.1.20)。在 Linux 中分配文件描述符的方式是使用 __alloc_fd。当您执行 open 系统调用时,将调用 do_sys_open 。此例程从 get_unused_fd_flags 获取一个空闲文件描述符:

long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
{
...
fd = get_unused_fd_flags(flags);
if (fd >= 0) {
struct file *f = do_filp_open(dfd, tmp, &op);

get_unused_d_flags 调用 __alloc_fd 设置最小和最大 fd:

int get_unused_fd_flags(unsigned flags)
{
return __alloc_fd(current->files, 0, rlimit(RLIMIT_NOFILE), flags);
}

__alloc_fd 获取进程的文件描述符表,获取fd为next_fd,实际上是上次运行时设置的:

int __alloc_fd(struct files_struct *files,
unsigned start, unsigned end, unsigned flags)
{
...
fd = files->next_fd;
...
if (start <= files->next_fd)
files->next_fd = fd + 1;

所以你可以看到文件描述符是如何单调增长的……直到某个点。当fd达到最大值时,__alloc_fd会尝试寻找最小的未使用文件描述符:

if (fd < fdt->max_fds)
fd = find_next_zero_bit(fdt->open_fds, fdt->max_fds, fd);

此时文件描述符将不再单调增长,而是会跳转尝试寻找空闲的文件描述符。在此之后,如果表已满,它将被扩展:

error = expand_files(files, fd);

此时它们将再次单调增长。

希望对你有帮助

关于linux - linux套接字的文件描述符总是按递增顺序排列吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9376189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com