一个元组,包含一个打开文件的操作系统级句柄(由os.open()返回)和该文件的绝对路径名,按顺序排列.
如何将操作系统级别的句柄转换为文件对象?
要将文件描述符包装在"文件对象"中,请使用fdopen().
所以我尝试过:
>>> import tempfile
>>> tup = tempfile.mkstemp()
>>> import os
>>> f = os.fdopen(tup[0])
>>> f.write('foo\n')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
IOError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud) 我正在编写一个Linux x86_64使用的服务器应用程序<sys/socket.h>.接受连接后accept(),我fdopen()用来将检索到的套接字包装成FILE*流.
写入和读取该FILE*流通常可以很好地工作,但是当它写入时,套接字变为不可用,同时它具有非空的读取缓冲区.
出于演示目的,我编写了一些侦听连接的代码,然后逐行读取输入到读缓冲区中fgetc().如果该行太长而无法放入缓冲区,则它不会被完全读取,而是在下一次迭代期间读取.
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
FILE* listen_on_port(unsigned short port) {
int sock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in name;
name.sin_family = AF_INET;
name.sin_port = htons(port);
name.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(sock, (struct sockaddr*) &name, sizeof(name)) < 0)
perror("bind failed");
listen(sock, 5);
int newsock = accept(sock, 0, 0);
return fdopen(newsock, "r+");
}
int main(int argc, char** argv) {
int bufsize …Run Code Online (Sandbox Code Playgroud) 我正在使用 fusionpy,我需要将文件描述符转换回文件对象,以便我可以获得原始文件路径
从fusepy示例中,创建文件时,会返回一个文件描述符 - 例如:
def open(self, path, flags):
print("open:", path)
return os.open(path, flags)
Run Code Online (Sandbox Code Playgroud)
返回的结果是一个整数:<class 'int'>其值为4
在一个名为 write 的单独函数中,我需要将文件描述符反转回文件,以便可以获得文件路径,所以我尝试了以下方法:
f = os.fdopen(fh)
Run Code Online (Sandbox Code Playgroud)
当我检查类型时,f我得到以下信息f is type: <class '_io.TextIOWrapper'>
这并不完全符合我的预期,但快速dir(f)表明它有一个name属性,我认为这就是我正在寻找的,除了name简单的数字4......
如何获取描述符指向的原始文件路径?
我在尝试编译程序时遇到以下错误:
calling fdopen: Bad file descriptor
我已经读过这可能是一个与在我的一个头文件中包含预编译头文件有关的问题.导致错误的文件包含stdio.h头文件,因此我可以访问FILE类型.如果我删除它,错误消失,但然后我不能使用FILE类型.有谁知道我怎么解决这个问题?
我想在 C 中创建一个文件描述符,我将在代码中指定其值。我有一个整数变量,它指定要创建的文件描述符的值。例如,我可能需要一个值为 5 的文件描述符,然后将其与名为 "sample.dat" 的文件相关联。
我想要一个FILE*类型使用fprintf.我需要用来fdopen获得一个FILE*而不是open那个返回一个int.但是,我们可以做同样的fdopen和open?(我从未使用过fdopen)
我想这样做fdopen:
open("my_file", 0_CREAT | O_RDWR | O_TRUNC, 0644);
Run Code Online (Sandbox Code Playgroud) 是否有可能编写一个程序,该程序能够接受另一个应用程序的打开文件描述符,并且只传递它们的内容而不进行任何转换?
假设 App A 对磁盘上的某个文件有一个打开的 FD,它正在向其写入数据。
我希望能够以某种方式访问打开的 FD,以便任何时候 App A 将数据写入该文件,我都可以将该写入广播到其他对该操作感兴趣的 App。
我希望能够在开放 FD 上复用读/写操作。
一个更具体的例子;我有一个 MIDI 键盘和一些合成器,我希望能够打开 MIDI 键盘文件描述符并将所有传入的写入操作传递给 0-N 个感兴趣的合成器。
在 C 中,我可以像这样写入文件描述符 3:
$ cat write.c
#include <unistd.h>
int main(void) {
write(3, "written in fd 3\n", 16);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以调用该程序并将 fd 3 重定向到 fd 1 (stdin),如下所示:
$ ./write 3>&1
written in fd 3
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Python中做到这一点?我检查过,os.open()但它从文件系统中的文件中创建了一个文件描述符(显然我无法选择要分配的文件描述符),并os.fdopen()从文件描述符中创建了一个文件对象(使用os.open())。那么,我该如何选择文件描述符号呢?
我试过:
with os.fdopen(3, 'w+') as fdfile:
Run Code Online (Sandbox Code Playgroud)
但它给了我:
OSError: [Errno 9] Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
编辑:这是我的Python程序:
$ cat fd.py
import os
with os.fdopen(3, 'w+') as fdfile:
fdfile.write("written to fd 3\n")
fdfile.close()
Run Code Online (Sandbox Code Playgroud)
这是我运行它时的结果:
$ python fd.py 3>&1
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud)