linux中的fd就绪时,会立即回调rollback,那么哪位大牛能帮忙解释下fd就绪的条件是什么

linux中的fd就绪时,会立即回调rollback,那么哪位大牛能帮忙解释下fd就绪的条件是什么,第1张

select系统调用原型如下:

#include <sys/select.h>int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, struct timeval* timeout)12

参数readfds, writefds, exceptfds参数分别指向可读、可写和异常事件对应的文件描述符集合。

哪些情况下文件描述符可以被认为是可读、可写或者出现异常,对于select的使用非常关键。

在网络编程中,下列情况下socket可读:

1、socket内核接收缓存区中的字节数大于或等于其低水位标记SO_RCVLOWAT。此时可以无阻塞地读该socket,并且读 *** 作返回的字节数大于0。

2、socket通信对方关闭连接。此时对该socket读 *** 作将返回0。

3、监听socket上有新的连接请求。

4、socket上有未处理的错误。此时我们可以使用getsockopt来读取和清除该错误。

下列情况下socket可写:

1、socket内核发送缓冲区中的可用字节数大于或等于其低水位标记SO_SNDLOWAT。此时我们可以无阻塞写该socket,并且写 *** 作返回的字节数大于0。

2、socket写 *** 作被关闭。对写 *** 作被关闭的socket执行写 *** 作将触发一个SIGPIPE信号。

3、socket使用非阻塞connect连接成功或者失败(超时)之后。

4、socket上有未处理的错误。此时我们可以使用getsockopt来读取和清除该错误。

网络程序中,select能处理的异常情况只有一种:socket上接收到带外数据。

shell下输入“man 2 read ” 你先看看。

ssize_t read(int fd, void *buf, size_t count)

意义:从文件描述符fd所指向的文件中读取count个字节的数据到buf所指向的缓存中。

文件描述符是由无符号整数表示的句柄,进程使用它来标识打开的文件。

文件描述符0代表标准文件。

fd是这么来的。

fd=(open或creat成功调用时的返回值)。

我上学是书上就写这么多了。

在Linux下一切资源皆文件,普通文件是文件,磁盘打印机是文件,socket 当然也是文件。

关于Linux下系统,进程能最大能打开的文件描述符数看过好多文章,但大都没有完整,详细说明每个值表示什么意思,在实践中该怎么设置?

如何通过最简单的设置来实现最有效的性能调优,如何在有限资源的条件下保证程序的运作?

max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

ulimit -n 控制进程级别能够打开的文件句柄的数量,提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。

对于服务器来说,file-max和ulimit都需要设置,否则会出现文件描述符耗尽的问题。

一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。

相关的3个文件:

/proc/sys/fs/file-max

/proc/sys/fs/file-nr

/etc/security/limits.conf

/proc/sys/fs/file-max

Linux系统级别限制所有用户进程能打开的文件描述符总数。

max-file 表示系统级别的能够打开的文件句柄的数量,是对整个系统的限制,并不是针对用户的。

/etc/security/limits.conf

用户级别的限制是通过可以通过命令ulimit命令和文件/etc/security/limits.conf

/proc/sys/fs/file-nr 该参数是只读的,不能修改。

file-nr的值由3部分组成:

1,已经分配的文件描述符数;

2,已经分配但未使用的文件描述符数;

3,内核最大能分配的文件描述符数

/proc/${pid}/fd

众所周知,在相应进程的/proc/$pid/fd 目录下存放了此进程所有打开的fd。

当然有些可能不是本进程自己打开的,如通过fork()从父进程继承而来的。

那么这个socket:后面的一串数字是什么呢?其实是该socket的inode号。

那么,知道了某个进程打开的socket的inode号后,我们可以做什么呢?

这就涉及到/proc/net/tcp(udp对应/proc/net/udp)文件了,其中也列出了相应socket的inode号通过比对此字段,我们能在/proc/net/tcp下获得此套接口的其他信息,如对应的<本地地址:端口号,远端地址:端口号>对,窗口大小,状态等信息。

具体字段含义详见net/ipv4/tcp_ipv4.c 中的 tcp4_seq_show 函数。

如果socket创建了,没有被使用,那么就只会在/proc/pid/fd下面有,而不会在/proc/net/下面有相关数据。

目录中的每一项都是一个符号链接,指向打开的文件,数字则代表文件描述符。

其中0 = /dev/null ,1 = stdout, 2 = stderr,用cat或tail查看即可。

Number of file descriptors: different between /proc/sys/fs/file-nr and /proc/$pid/fd?

https://serverfault.com/questions/485262/number-of-file-descriptors-different-between-proc-sys-fs-file-nr-and-proc-pi

Linux中最大文件描述符数

https://leokongwq.github.io/2016/11/09/linux-max-fd.html

How do linux file descriptor limits work?

https://stackoverflow.com/questions/3991223/how-do-linux-file-descriptor-limits-work

limits.conf(5) - Linux man page

https://linux.die.net/man/5/limits.conf

Why can't I tail -f /proc/$pid/fd/1 ?

https://unix.stackexchange.com/questions/152773/why-cant-i-tail-f-proc-pid-fd-1

Linux查看进程运行输出(/proc/<pid>/fd)

https://blog.csdn.net/u014756245/article/details/120023188


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8719026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存