我必须使用某个跨平台库来传递FILE*
对象。
我从另一个源(继承)获得一个文件描述符,我想在'd 进程中保持相同。fd
fork
我目前用于fdopen
将文件描述符转换为FILE*
对象。
我的问题是fclose
用于清理FILE*
对象关闭连接的文件描述符。
我非常希望在使用此文件描述符后保留它。
有没有办法从中拯救文件描述符FILE*
?
有没有办法把它拆开?
FILE*
或者一种用虚拟代替文件描述符的方法?
PS这需要是跨平台的,无论如何都要跨POSIX。
假设那fd
是您的文件描述符,而f
您的 FILE* 是从中获得的。也许像下面这样的东西可以解决问题:
fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);
我的问题是
fclose
用于清理FILE*
对象关闭连接的文件描述符。
您可以dup(2)
用来获取描述符的副本。然后close(2)
that fclose(3)
does 不会做任何事情。
我需要保持完全相同的 fd 号码
然后dup2
再次调用fclose
:dup2(savedfd, rescuedfd)
当您从另一个来源获取文件描述符时,请尝试从该文件描述符中获取其文件名。(有人说它可以使用特定于平台的方法。-google it。)
一旦你得到文件名,然后再次 fopen 并得到 FILE* 并完成你的工作并使用 fclose 清理它。
您原来的 fd 不会受到干扰。
这是一个不可移植的想法(如果您认为这是好的/最好的,请投票):
GNU libc 提供fopencookie
和 BSD 提供等效funopen
的 .
这些返回真正的FILE*
句柄,但实现是你自己的:
然后将 read/write/seek/close 函数映射到底层系统调用相对简单:
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!