我必须使用某个跨平台库来传递FILE*
对象。
我从另一个源(继承的)获得一个文件描述符,我希望在fork
'd进程中保持相同的fd
。
我目前使用fdopen
将文件描述符转换为FILE*
对象。
我的问题是,用于清理FILE*
对象的fclose
关闭了连接的文件描述符。
我非常想在使用完这个文件描述符后保留它。
有办法从FILE*
中拯救文件描述符吗?
有办法把它拆下来吗?
或者用一个伪文件替换FILE*
中的文件描述符?
附言:这需要跨平台,无论如何都要跨POSIX。
假设fd
是你的文件描述符,f
是你的file*
fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);
我的问题是用于清理
FILE*
对象的fclose
关闭连接的文件描述符。
您可以使用dup(2)
来获取描述符的副本。那么CCD_ 16所做的CCD_。
我需要保持完全相同的fd编号
然后在fclose
之后再次调用dup2
:dup2(savedfd, rescuedfd)
当您从另一个源获取文件描述符时,请尝试从该文件描述符获取其文件名。(有人说,使用特定平台的方法是可能的。-谷歌一下。)
一旦你得到文件名,然后再次打开它,得到FILE*,然后用fclose完成你的工作并清理它。
您原来的fd不会受到干扰。
这里有一个不可移植的想法(如果你认为这是好的/最好的,请投票):
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!