是否可以从FILE *中挽救文件描述符?

时间:2014-04-11 09:38:00

标签: c file posix fclose fdopen

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

我从其他来源(继承)获取文件描述符,我希望在fd个进程中保持相同fork

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

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

我非常想在使用后保留这个文件描述符。

是否有一种来自FILE*的救援文件描述符?

有没有办法拆分它?

或者用{0}替换FILE*中的文件描述符?

P.S。这需要跨平台,无论如何都要横跨POSIX。

4 个答案:

答案 0 :(得分:2)

  

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

您可以使用dup(2)获取描述符的副本。然后close(2) fclose(3)确实无法做任何事情。

  

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

然后在dup2fclose

之后再次致电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!