我必须使用某个跨平台的库来传递FILE*
个对象。
我从其他来源(继承)获取文件描述符,我希望在fd
个进程中保持相同fork
。
我目前使用fdopen
将文件描述符转换为FILE*
对象。
我的问题是fclose
用于清理FILE*
个对象会关闭连接的文件描述符。
我非常想在使用后保留这个文件描述符。
是否有一种来自FILE*
的救援文件描述符?
有没有办法拆分它?
或者用{0}替换FILE*
中的文件描述符?
P.S。这需要跨平台,无论如何都要横跨POSIX。
答案 0 :(得分:2)
我的问题是用于清理
fclose
个对象的FILE*
关闭了 连接文件描述符。
您可以使用dup(2)
获取描述符的副本。然后close(2)
fclose(3)
确实无法做任何事情。
我需要保持完全相同的fd编号
然后在dup2
:fclose
dup2(savedfd, rescuedfd)
答案 1 :(得分:2)
假设fd
是您的文件描述符,f
您的文件*来自它。也许像下面这样的东西会起作用:
fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);
答案 2 :(得分:1)
当您从其他来源获取文件描述符时,尝试从该文件描述符中获取其文件名。 (有人说可能使用特定于平台的方法.-- google it。)
一旦你得到文件名然后再次打开它并获得FILE *并完成你的工作并使用fclose清理它。
你原来的fd不会被打扰。
答案 3 :(得分:0)
这是一个不可移植的想法(如果你认为这是好的/最好的,请投票):
GNU libc提供fopencookie
,BSD提供等效的funopen
。
这些返回真正的FILE*
句柄,但实现是你自己的:
将读/写/查找/关闭函数映射到底层系统调用是相对简单的:
read/readfn(cookie, buf, size){ return read((int)cookie, buf, size); }
write/writefn(cookie, buf, size) { return write((int)cookie, buf, size); }
seek/seekfn(cookie, offs, arg) { return seek((int)cookie, offs, arg); } // may require arg mapping to whence
close/closefn(cookie) {} // that's the whole point!