1

我必须使用某个跨平台库来传递FILE*对象。

我从另一个源(继承)获得一个文件描述符,我想在'd 进程中保持相同。fdfork

我目前用于fdopen将文件描述符转换为FILE*对象。

我的问题是fclose用于清理FILE*对象关闭连接的文件描述符。

我非常希望在使用此文件描述符后保留它。

有没有办法从中拯救文件描述符FILE*

有没有办法把它拆开?

FILE*或者一种用虚拟代替文件描述符的方法?

PS这需要是跨平台的,无论如何都要跨POSIX。

4

4 回答 4

2

假设那fd是您的文件描述符,而f您的 FILE* 是从中获得的。也许像下面这样的东西可以解决问题:

fd2 = dup(fd);
fclose(f);
dup2(fd2, fd);
close(fd2);
于 2014-04-11T09:55:18.720 回答
2

我的问题是fclose用于清理FILE*对象关闭连接的文件描述符。

您可以dup(2)用来获取描述符的副本。然后close(2)that fclose(3)does 不会做任何事情。

我需要保持完全相同的 fd 号码

然后dup2再次调用fclosedup2(savedfd, rescuedfd)

于 2014-04-11T09:40:15.313 回答
1

当您从另一个来源获取文件描述符时,请尝试从该文件描述符中获取其文件名。(有人说它可以使用特定于平台的方法。-google it。)

一旦你得到文件名,然后再次 fopen 并得到 FILE* 并完成你的工作并使用 fclose 清理它。

您原来的 fd 不会受到干扰。

于 2014-04-11T09:49:32.900 回答
0

这是一个不可移植的想法(如果您认为这是好的/最好的,请投票):

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!
于 2014-04-11T13:56:22.337 回答