我写了一种严重的文件密集型测试套件.过了一段时间(2小时)我得到了一个IOError: [Errno 24] Too many open files: '/tmp/tmpxsqYPm'.我仔细检查了所有文件句柄是否再次关闭它们.但错误仍然存在.
我试图弄清楚使用的允许文件描述符resource.RLIMIT_NOFILE的数量和当前打开的文件解析器的数量:
def get_open_fds():
fds = []
for fd in range(3,resource.RLIMIT_NOFILE):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
Run Code Online (Sandbox Code Playgroud)
所以,如果我运行以下测试:
print get_open_fds()
for i in range(0,100):
f = open("/tmp/test_%i" % i, "w")
f.write("test")
print get_open_fds()
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...
Run Code Online (Sandbox Code Playgroud)
这很奇怪,我预计会有越来越多的打开文件描述符.我的剧本是否正确?
我正在使用python的logger和subprocess.这可能是我的fd泄漏的原因吗?
谢谢,丹尼尔
我正在使用select函数在我的套接字之间进行通信.我有一个循环,我做 -
while(!done) {
FD_ZERO(&read_flags);
FD_ZERO(&write_flags);
FD_SET(comm_fd1, &read_flags);
FD_SET(comm_fd2, &read_flags);
FD_SET(STDIN_FILENO, &read_flags);
FD_SET(comm_fd1, &write_flags);
FD_SET(comm_fd2, &write_flags);
FD_SET(STDIN_FILENO, &write_flags);
//call select
sel = select(comm_fd1+comm_fd2+1, &read_flags, &write_flags, (fd_set*)0, &waitd);
Run Code Online (Sandbox Code Playgroud)
和客户端的不同变量相同.我从在线教程中获得了这个基本技术,并且随之而来.然后它打了我 - 为什么我每次循环时清除集合并添加文件描述符?如果它们已经添加,为什么要清除它们并再次添加?所以我尝试在此之前只执行一次,并且代码不再相同.有人可以解释原因吗?是否因为select修改了集合的内容?任何帮助和/或见解表示赞赏.
如果由于某种原因,我发现我的程序中有一个致命的情况,我想退出错误代码.有时,致命错误的上下文超出了其他文件描述符的范围.关闭这些文件描述符是一个好习惯.据我所知,这些文件会在进程终止时自动关闭.
我想使用bash变量来指示文件描述符,如下所示:
id=6
file=a
exec $id<>$file
Run Code Online (Sandbox Code Playgroud)
但用法是错误的:
-bash: exec: 6: not found
Run Code Online (Sandbox Code Playgroud)
那么,如何使用变量来指示exec命令中的文件描述符?
这个问题不是关于如何使用File #close或File#open block语法自动关闭文件.这是一个关于Ruby在运行时存储其打开文件描述符列表的问题.
如果您的程序具有开放描述符,但您无权访问相关的文件或IO对象,那么如何找到对当前打开的文件描述符的引用?举个例子:
filename='/tmp/foo'
%x( touch "#{filename}" )
File.open(filename)
filehandle = File.open(filename)
Run Code Online (Sandbox Code Playgroud)
第一个File实例被打开,但对象的引用不存储在变量中.第二个实例被存储在文件句柄,其中I可以很容易地与#inspect或#关闭访问它.
但是,丢弃的File对象没有消失; 它只是无法以任何明显的方式访问.在对象完成之前,Ruby必须在某个地方跟踪它...但在哪里?
我最近一直在使用相当数量的文件描述符,我一直在想为什么它们被实现为整数?
这意味着它们容易混淆其他整数,并且没有办法在没有上下文的情况下知道它们是什么,它们指向什么,它们是否是开放的等等.
在C中,FILE是一种不透明的struct类型.许多人也typedef例如status_t作为整数,因此它们的功能是显而易见的.似乎最好的做法是将它们实现为opaque类型,或者(例如在C++中)作为可以处理某些实现的类,并且还清理namespace一下(调用pipe()或open()看起来如此无害) ,如果没有上下文,你的管道或开放并不明显.例如std::file_descriptor,使用构造函数/工厂函数来创建管道或打开文件等.
我希望这是关于这个网站的主题; 我试图将其称为" 为什么做出了这个特别的决定? "如果有人知道某个地方它更合适,请告诉我.
我想挑起一个没有文件描述符的情况.
我一直在考虑两种可能性:
你会怎么做?
从我一直在阅读上由The Open Group网站上fcntl,open,read,和write,我得到的印象是,是否O_NONBLOCK被设置在一个文件描述符,因此非阻塞I/O是否使用与描述符,应该是一个属性该文件描述符而不是底层文件.作为文件描述符的属性意味着,例如,如果我复制文件描述符或打开另一个描述符到同一个文件,那么我可以使用阻塞I/O和一个非阻塞I/O与另一个.
然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I/O描述符和非阻塞I/O描述符(因此O_NONBLOCK设置是否是基础文件的属性[FIFO] ):
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fds[2];
if (pipe(fds) == -1) {
fprintf(stderr, "`pipe` failed.\n");
return EXIT_FAILURE;
}
int fd0_dup = dup(fds[0]);
if (fd0_dup <= STDERR_FILENO) {
fprintf(stderr, "Failed to duplicate the read end\n");
return EXIT_FAILURE;
}
if (fds[0] == fd0_dup) {
fprintf(stderr, "`fds[0]` should not equal `fd0_dup`.\n");
return EXIT_FAILURE;
}
if …Run Code Online (Sandbox Code Playgroud) 我正在学习文件描述符,我写了这段代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
int fdrd, fdwr, fdwt;
char c;
main (int argc, char *argv[]) {
if((fdwt = open("output", O_CREAT, 0777)) == -1) {
perror("Error opening the file:");
exit(1);
}
char c = 'x';
if(write(fdwt, &c, 1) == -1) {
perror("Error writing the file:");
}
close(fdwt);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
,但我得到了: Error writing the file:: Bad file descriptor
我不知道会出现什么问题,因为这是一个非常简单的例子.
有没有办法在PhantomJS中触发PDF导出功能而不指定扩展名为.pdf的输出文件?我们想stdout用来输出PDF.