正在从服务器向客户端传输一个大小为 2gb 的文件。在客户端,收到该文件的 512mb 后,我打开它:
FILE *fp= fopen("that file","r");
现在下载完成后,我可以使用该文件描述符访问该文件的全部 2gb 数据吗?还是我需要重新打开它才能访问整个文件?
最佳答案
首先,您应该避免在 Linux 文件名中使用空格。所以你的例子应该是 FILE *fp= fopen("that_file","r");
在文件名中有空格(或者甚至像换行符这样的控制字符)是不好的品味。
在 Linux 下,文件描述符(不是 FILE*
句柄!)是一个小整数,由内核处理:在内核中,进程有一个打开文件表,它们的应用程序代码通过它们的文件描述符引用(使用像open
和read
等系统调用)这些文件。标准 C 库管理缓冲和文件描述符(因此在 FILE
数据结构中有缓冲区和文件描述符)。
因此,如果您有一个进程读取一个文件,而另一个进程同时写入文件(这是一种不好的做法),则读取进程能够读取所有可用字节。
所以你不需要“更新”你的fp
但是你的代码很糟糕(因为读写过程之间缺乏同步)。
关于c - 我需要在这里更新文件描述符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7980242/