我需要在这里更新文件描述符吗?

时间:2011-11-02 12:24:23

标签: c linux file-descriptor

一个文件大小为2gb正在从服务器传输到客户端。在客户端,收到该文件的512mb后,我打开它:

FILE *fp= fopen("that file","r"); 

现在下载完成后,我可以使用该文件描述符访问该文件的整个2gb数据吗?或者我是否需要重新打开它才能访问整个文件?

3 个答案:

答案 0 :(得分:2)

首先,您应该避免使用Linux文件名中的空格。所以你的例子应该是FILE *fp= fopen("that_file","r");文件名中有空格(甚至像换行符这样的控制字符)是不好的。

在Linux下,文件描述符(不是一个FILE*句柄!)是一个小整数,由内核处理:在内核中,进程有一个表打开文件及其应用程序代码通过文件描述符引用(使用openread等系统调用)这些文件。标准C库管理缓冲和文件描述符(因此在FILE数据结构中有缓冲区和文件描述符。)

因此,如果您有一个进程正在读取文件,而另一个进程同时写入(这是不好的做法),则读取过程能够读取所有可用字节。

所以你不需要“更新”你的fp但你的代码很糟糕(因为阅读和写作过程之间缺乏同步)。

答案 1 :(得分:1)

无需重新打开文件;如果您在客户端中定期请求文件的大小,您会看到它增长。请注意,在写入过程刷新缓冲区之前,文件不会增长。

(A FILE*不是文件描述符,顺便说一下。)

答案 2 :(得分:-2)

应更新文件描述符以访问整个文件。通常,当打开文件时,文件的当前内容将被加载到内存中,文件描述符将对其进行修改,并且外部文件的任何更新都不会在加载的内存中更新。