重新打开另一个访问文件描述符?

假设操作系统是Linux。 假设我打开一个文件进行写入并获得一个文件描述符fdw 。 是否有可能获得另一个文件描述符fdr ,只需访问该文件而不必再次调用open ? 我不想调用open的原因是底层文件可能已被移动,甚至在文件系统中被其他进程取消链接,因此重新使用相同的文件名对于这样的操作是不可靠的。 所以我的问题是:无论如何打开一个文件描述符与不同的访问权限,如果只给一个文件描述符? dupdup2不会改变访问权限,我想。

Solutions Collecting From Web of "重新打开另一个访问文件描述符?"

是! 诀窍是通过/proc/self/fd/n访问已删除的文件。 据我所知,这只是一个linux的窍门。

运行这个程序:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { FILE* out_file; FILE* in_file; char* dev_fd_path; char buffer[128]; /* Write “hi!” to test.txt */ out_file = fopen("test.txt", "w"); fputs("hi!\n", out_file); fflush(out_file); /* Delete the file */ unlink("test.txt"); /* Verify that the file is gone */ system("ls test.txt"); /* Reopen the filehandle in read-mode from /proc */ asprintf(&dev_fd_path, "/proc/self/fd/%d", fileno(out_file)); in_file = fopen(dev_fd_path, "r"); if (!in_file) { perror("in_file is NULL"); exit(1); } printf("%s", fgets(buffer, sizeof(buffer), in_file)); return 0; } 

它将一些文本写入文件,删除它,但保持文件描述符打开,然后通过不同的路线重新打开。 直到最后一个持有最后一个文件描述符的进程关闭它,文件才被真正删除,直到那时,你可以通过/proc获取文件内容。


感谢我的老板阿纳托利为我教授了这个技巧,当时我删除了一些重要的文件,幸运的是它们仍然被另一个进程所追加!

不, fcntl调用不会让您在打开的文件描述符上设置读/写位,从现有文件描述符获取新文件描述符的唯一方法是使用重复功能。 对dup / dup2 / dup3 (和fcntl )的调用不允许您更改文件访问模式。

注意:这对于Linux来说是正确的,但是对于其他的Unix来说并不是这样。 例如,在HP-UX中[参见(1)和(2) ],您可以使用F_SETFL在打开的文件描述符中使用fcntl更改读/写位。 由于由dup创建的文件描述符共享相同的状态标志,但是改变一个访问模式必然会改变另一个。