分类: LINUX
2011-12-30 19:33:41
++++++APUE读书笔记-04文件和目录(4)++++++
11、chown,fchown,和lchown函数
================================================
chown函数允许我们修改文件的User-ID或者Group-ID。声明如下:
include
int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int filedes, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);
三者返回:如果成功返回0,如果错误返回1(其实值一般为-1)。
除了所引用的文件是符号连接情况以外,这三个函数的操作相类似。参数含义类似前面,chown和lchown修改路径指向文件的属主/组,而fchown修改被打开的文件描述符号代表的文件的属主/组。在是符号连接情况下, lchown更改符号连接本身的所有者,而不是该符号连接所指向的文件。
参考资料:
12、文件的大小
================================================
stat结构的st_size成员包含了文件的大小,这个成员仅对正规文件(也就是普通文件),目录,链接文件有意义。对于普通文件,如果大小为0,则表示我们读取文件的时候将会获得一个文件结束标记;对于目录文件,文件大小一般是一个数的整数倍(例如16或者512),我们后面会讨论目录读取;对于符号链接,文件大小表示链接所指向的文件的文件名称的大小。
例如:
lrwxrwxrwx 1 root 7 Sep 25 07:14 lib -> usr/lib
这里的例子中,符号链接文件lib的大小就是其所指向的文件名称“usr/lib”的名称大小(注意:符号链接的大小不包含C语言的用来结束字符串的空字符)。
目前多数UNIX系统提供了st_blksize和st_blocks域。前者表示这个文件进行I/O的时候的期望块大小,后者表示实际分配的512字节块的数目。前面第3章第8节中我们曾经说过,读取一个文件,设置不同的缓存,消耗的时间有所不同。当我们设置其大小为st_blksize的时候,实际就是最优的大小,这时候读取文件消耗的时间最小。后面我们讨论的标准I/O库就因为效率的原因,尝试每次都是用st_blksize字节的大小进行读写。另外,我们需要注意,不同版本的UNIX系统使用的st_blocks的单位可能不全是512字节块。
文件空洞
在第3章中我们提到一个普通文件可能包括空洞。空洞可以通过定位到超过文件的结尾之后的某个位置,然后进行写,这样的方式来产生。例如:
$ ls -l core
-rw-r--r-- 1 sar 8483248 Nov 18 12:18 core
$ du -s core
272 core
这样看到文件的大小是8M,但是通过du命令看到的大小确说明这个文件所占用的磁盘空间是272个512字节大小的块(139,264字节)。通过这个结果,我们显然可以看出来,文件包含空洞。
正如我们第3章中所讲述的,对于没有被写入的文件位置,读取函数返回的数据字节数目为0。如果我们如下执行:
$ wc -c core
8483248 core
从这里我们可以看到,普通的I/O操作,读取了整个大小的文件。带有-c选项的wc命令会对文件中的字符(字节)数目进行计数。
如果我们使用cat对文件进行拷贝,那么所有的文件空洞将被当作实际的数据0写入生成的文件,如下:
$ cat core > core.copy
$ ls -l core*
-rw-r--r-- 1 sar 8483248 Nov 18 12:18 core
-rw-rw-r-- 1 sar 8483248 Nov 18 12:27 core.copy
$ du -s core*
272 core
16592 core.copy
通过这里,我们可以看到,新文件实际的占用字节数目是8,495,104字节(就是512x16,592字节)。此长度与ls命令报告的长度(8483248)之间的差别是由于文件系统使用了若干块以保存指向实际数据块的指针。
参考:
13、文件截断
================================================
有时我们需要在文件尾端处截去一些数据以缩短文件。将一个文件的长度截断为 0是一个特例,open时候用O_TRUNC标志可以做到这一点。
为了截断文件可以调用函数truncate和ftruncate。声明如下:
#include
int truncate(const char *pathname, off_t length);
int ftruncate(int filedes, off_t length);
两者返回:如果成功返回0,如果错误返回1(实际值应该为-1)。
函数的参数和前面函数类似,不重复。函数的作用是将指定的存在的文件的长度截短为length。如果该文件以前的长度大于length,则超过length以外的数据就不再能存取。如果以前的长度短于length,则其结果依赖系统实现。若某个实现的处理是扩展该文件,则在以前的文件尾端和新的文件尾端之间的数据将读作0 (也就是在文件中创建了空洞)。
参考: