一个文件大小为2gb正在从服务器传输到客户端。在客户端,收到该文件的512mb后,我打开它:
FILE *fp= fopen("that file","r");
现在下载完成后,我可以使用该文件描述符访问该文件的整个2gb数据吗?或者我是否需要重新打开它才能访问整个文件?
答案 0 :(得分:2)
首先,您应该避免使用Linux文件名中的空格。所以你的例子应该是FILE *fp= fopen("that_file","r");
文件名中有空格(甚至像换行符这样的控制字符)是不好的。
在Linux下,文件描述符(不是一个FILE*
句柄!)是一个小整数,由内核处理:在内核中,进程有一个表打开文件及其应用程序代码通过文件描述符引用(使用open
和read
等系统调用)这些文件。标准C库管理缓冲和文件描述符(因此在FILE
数据结构中有缓冲区和文件描述符。)
因此,如果您有一个进程正在读取文件,而另一个进程同时写入(这是不好的做法),则读取过程能够读取所有可用字节。
所以你不需要“更新”你的fp
但你的代码很糟糕(因为阅读和写作过程之间缺乏同步)。
答案 1 :(得分:1)
无需重新打开文件;如果您在客户端中定期请求文件的大小,您会看到它增长。请注意,在写入过程刷新缓冲区之前,文件不会增长。
(A FILE*
不是文件描述符,顺便说一下。)
答案 2 :(得分:-2)
应更新文件描述符以访问整个文件。通常,当打开文件时,文件的当前内容将被加载到内存中,文件描述符将对其进行修改,并且外部文件的任何更新都不会在加载的内存中更新。