- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
读取手册页以关闭,如果它被信号打断,则未指定fd的状态。是否有处理这种情况的最佳实践,还是此后假设它成为操作系统的问题。
我认为EIO适当关闭fd之后会失败。
最佳答案
如果您希望程序长时间运行,可能的文件描述符泄漏绝不仅仅是操作系统的问题。不使用许多文件描述符的短期程序当然可以选择终止未关闭的描述符,并依赖内核在程序终止时将其关闭。因此,对于我的其余回答,我将假定您的程序正在长时间运行。
如果您的程序不是多线程的,则情况很简单:
int close_some_fd(int fd, int *was_interrupted) {
*was_interrupted = 0;
/* this is point X to which I will draw your attention later. */
for (;;) {
if (0 == close(fd))
return 0; /* Success. */
if (EIO != errno)
return -1; /* Some failure, not interrupted by a signal. */
/* Our close attempt was interrupted. */
*was_interrupted = 1;
int fdflags = 0;
/* Just use the fd to find out if it is still open. */
if (0 != fcntl(fd, F_GETFD, &fdflags))
return 0; /* Interrupted, but file is also closed. So we are done. */
}
}
dup
,
dup2
,
socket
,
open
,
accept
或其他一些类似的函数使内核分配文件描述符。
O_CLOEXEC
,则可以使用
fcntl
在代码中标记为
X
的点处设置O_CLOEXEC标志,然后将现有调用更改为
fcntl
,如下所示:
if (0 = fcntl(fd, F_GETFD, &fdflags)) {
if (fdflags & O_CLOEXEC) {
/* open, and still marked with O_CLOEXEC, unused elsewhere. */
continue;
} else {
return 0; /* Interrupted, but file is also closed. So we are done. */
}
}
O_CLOEXEC
以外的其他功能(例如,也许
fstat
记录
st_dev
和
st_ino
),但是如果您不确定多线程程序的其余部分正在做什么,则此一般想法可能会令人不满意。
sendmsg
将文件描述符跨Unix域套接字传递到单独的单线程专用服务器,该服务器的唯一工作就是关闭文件描述符。是的,这有点令人讨厌。这种方法的一些有趣之处在于:
sendmsg
时也需要阻止信号传递。但是,这意味着每个文件描述符关闭都会占用用户空间上下文切换开销(除非您将它们分批分配以分摊成本)。您需要避免线程A可能正在读取与线程B发出的请求相对应的fd-closed-OK报告的情况。您可以通过序列化关闭操作(这将限制性能)或对响应进行多路分解(即复杂的)。或者,您可以使用其他一些IPC机制来避免进行序列化或多路分解(例如,SYSV信号量)。 EIO
是否通常使文件描述符保持关闭状态。也就是说,确定
EIO
上文件描述符的理论上未指定的状态在实践中是否可预测。如果fd可以是任何东西(例如磁盘文件,套接字,tty等),这将无法正常工作。当然,如果您使用的是某些开源操作系统,则可能只能够读取内核源代码并确定可能的结果。
关于sockets - 如果关闭被中断或失败,fd的状态是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6707484/
正如我不断发现的那样,有各种各样的文件描述符——几乎所有的东西都是围绕文件描述符抽象出来的:常规文件、套接字、信号和计时器(例如)。所有文件描述符都只是整数。 给定一个文件描述符,是否可以知道它是什么
socket fd 长什么样子? 什么是 socket fd ?粗糙的来讲,就是网络 fd,比如我们最常见的 C/S 客户端服务端的编程模式,就是网络通信的一种方式。撇开底层
如果我调用了shutdown(fd,SHUT_RDWR),但没有调用close(fd),会发生什么? inline void CSocket::close() { if (_socket_fd
我有以下结构: struct myfds_for_nic { int fd1; int fd2; int fd3; int fd4; int fd5;
fd 是否有等价于 fseek 的东西?我已经使用 int fds 很长时间了,想使用 fseek...但我知道没有搜索功能。 提前致谢! 最佳答案 参见 POSIX 函数 lseek(2) : SY
我正在使用 Clojure 的 core.logic CLP(FD) 库(core.logic 版本 0.8.3)开发一种简单的方形打包算法。 正方形的表示方式如下: [[[x11 y11] [x12
我正在学习 linux 操作系统,我有一个关于管道的问题。 我想实现一个管道。 所以我定义了int fd[2]; 但是为什么fd[0]是读而fd[1]是写呢? 0代表stdin吗? (我认为是写)而1
我知道进程的pid,需要获取它使用的socketfd,所以在/proc/$pid/中查找fd,例如: $ ls -la /proc/1442/fd | grep socket lrwx------ 1
我正在检查当前 fatrace 的源代码。 调用fanotify获取数据值的主循环如下: res = read (fan_fd, buffer, 4096); ... data
Docker daemon documentation建议大多数设置使用以下 hosts 选项: dockerd -H fd:// 我猜 fd 代表文件描述符。我不明白 fd 如何用于套接字通信。 我
在执行之前:os.read(fd,1024) 我想检查是否会有输出,而不是挂起直到收到输出。由于 fd 是一个 int 对象,我不能这样做: os.fstat(f.fileno()).st_size
我有一个程序 ( https://github.com/raboof/connbeat ) 依赖于 /proc/[pid]/fd/* 来查找给定(网络)inode 的进程。 /proc/[pid]/f
#define STACK_SIZE (1024 * 1024) static char container_stack[STACK_SIZE]; char* const container_args
inotify file in C 我看过下面的代码用来调用 (void) inotify_rm_watch(fd, wd); (void) close(fd); 为什么不呢? inotify_rm_
下面的小 C 程序(我们称之为 pointless): /* pointless.c */ #include #include void main(){ write(STDOUT_FILENO
考虑这个代码示例: #include #include #include int main() { //this file exists and contains data: "ABCD
在父进程中close(fd[1]);, 为什么它会跳过第一个 fd[1](替换为父 STD_OUT)并在子进程中关闭 fd[1]? #define STD_INPUT 0 #define STD_OU
需要使用代理设置运行模拟器,我在命令提示符下使用以下命令来启动模拟器 emulator -avd AVD_for_3_7_WVGA_Nexus_One -http-proxy http://usern
我正在 appcelerator studio 中创建应用程序。在我向其添加 admob 模块之前,它在我的 Android 6 Lenovo a7000 上正常运行。现在我收到这些错误: [ERRO
我不明白必须如何解决以下问题。非常感谢任何帮助学习如何解决这个问题的人! Consider Relation Schema R = {ABCDEFG} with a set of Functional
我是一名优秀的程序员,十分优秀!