标签: file-descriptor

python中打开的文件太多了

我写了一种严重的文件密集型测试套件.过了一段时间(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泄漏的原因吗?

谢谢,丹尼尔

python file-descriptor

23
推荐指数
3
解决办法
2万
查看次数

为什么FD_SET/FD_ZERO用于循环内的select()?

我正在使用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修改了集合的内容?任何帮助和/或见解表示赞赏.

c++ select tcp file-descriptor clear

23
推荐指数
2
解决办法
2万
查看次数

在退出时关闭文件描述符是一个好习惯

如果由于某种原因,我发现我的程序中有一个致命的情况,我想退出错误代码.有时,致命错误的上下文超出了其他文件描述符的范围.关闭这些文件描述符是一个好习惯.据我所知,这些文件会在进程终止时自动关闭.

c coding-style file-descriptor

23
推荐指数
3
解决办法
1万
查看次数

如何使用变量在bash中指示文件描述符?

我想使用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命令中的文件描述符?

io bash file-descriptor exec

22
推荐指数
2
解决办法
6790
查看次数

Ruby在哪里跟踪其打开的文件描述符?

什么这个问题是不是关于

这个问题不是关于如何使用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必须在某个地方跟踪它...但在哪里?

ruby io file-io file-descriptor filehandle

21
推荐指数
1
解决办法
4833
查看次数

为什么UNIX文件描述符不是由它们自己的类型实现的,尤其是在C++中?

我最近一直在使用相当数量的文件描述符,我一直在想为什么它们被实现为整数?

这意味着它们容易混淆其他整数,并且没有办法在没有上下文的情况下知道它们是什么,它们指向什么,它们是否是开放的等等.

在C中,FILE是一种不透明的struct类型.许多人也typedef例如status_t作为整数,因此它们的功能是显而易见的.似乎最好的做法是将它们实现为opaque类型,或者(例如在C++中)作为可以处理某些实现的类,并且还清理namespace一下(调用pipe()open()看起来如此无害) ,如果没有上下文,你的管道或开放并不明显.例如std::file_descriptor,使用构造函数/工厂函数来创建管道或打开文件等.

我希望这是关于这个网站的主题; 我试图将其称为" 为什么做出了这个特别的决定? "如果有人知道某个地方它更合适,请告诉我.

c c++ unix linux file-descriptor

21
推荐指数
2
解决办法
1602
查看次数

我怎么能模拟缺少文件描述符?

我想挑起一个没有文件描述符的情况.

我一直在考虑两种可能性:

  1. 随机打开数千个文件,直到打开结果为-1
  2. 设置一个非常低数量的文件描述符(比如stdin,stdout和stderr).

你会怎么做?

c linux file-descriptor

20
推荐指数
1
解决办法
1282
查看次数

O_NONBLOCK是否设置了文件描述符或基础文件的属性?

从我一直在阅读上由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)

c file-descriptor nonblocking fcntl posix-api

19
推荐指数
1
解决办法
2万
查看次数

文件描述符错误

我正在学习文件描述符,我写了这段代码:

#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

我不知道会出现什么问题,因为这是一个非常简单的例子.

c unix file file-descriptor

19
推荐指数
3
解决办法
7万
查看次数

PhantomJS:将PDF导出到stdout

有没有办法在PhantomJS中触发PDF导出功能而不指定扩展名为.pdf的输出文件?我们想stdout用来输出PDF.

pdf pipe file-descriptor io-redirection phantomjs

19
推荐指数
3
解决办法
1万
查看次数